Как правильно переопределить равно для объекта Hibernate с @NaturalId

Получить строковое значение даты, используя метод dateObj.toJSON () Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON Нарезать дату из возвращаемого значения и затем увеличивать на количество дней, которое вы хотите.

var currentdate = new Date();
currentdate.setDate(currentdate.getDate() + 1);
var tomorrow = currentdate.toJSON().slice(0,10);

0
задан Andronicus 4 March 2019 в 20:32
поделиться

2 ответа

Согласно эта статья , equals и hashCode должна быть независимой от состояния. Если вы переопределили только первое, это плохо и может вызвать странные ошибки. У них должен быть контракт .

Самый простой способ - использовать ломбок - аннотируйте свой класс с помощью @EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false) и полей, используемых по сравнению с @EqualsAndHashCode.Include.

0
ответ дан Andronicus 4 March 2019 в 20:32
поделиться

Когда я изучил это некоторое время назад, я пришел к выводу, что нет единого правильного ответа.

Я закончил проверкой только свойства @Id в equals() и hashCode(), так как это, казалось, работало лучше всего. (Мы не используем @NaturalId s; вместо этого он мог бы работать с этим, но может быть безопаснее придерживаться @Id.)

Я думаю, что единственная потенциальная проблема, с которой я столкнулся, была если новый экземпляр добавляется в коллекцию перед сохранением. На практике этого никогда не происходит в нашем проекте, и поэтому он работает хорошо. (Если это произойдет в вашем проекте, вы все равно можете найти это лучшим компромиссом, чтобы избежать проблем, когда сохраняются объекты появляются в коллекциях, что встречается гораздо чаще.)

Как и другие ответы указали, что если вы переопределяете equals(), вы должны также переопределять hashCode(), чтобы гарантировать, что равные объекты всегда имеют одинаковый хэш-код. (Первый пример вопроса соответствует этому, хотя, возможно, это немного сбивает с толку, когда два метода не проверяют все одинаковые поля.)

Кстати, в Котлине эти два метода становятся незначительно управляемыми: [ 1115]

override fun equals(other: Any?) = other === this
                                || (other is MyEntity && entityId == other.entityId)

override fun hashCode() = entityId

(Еще один пример того, почему я люблю Котлина!)

0
ответ дан gidds 4 March 2019 в 20:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: