Я знаю, что эта тема обсуждалась много раз, но по-прежнему требуются некоторые разъяснения по проблеме, с которой мы сталкиваемся. Hibernate best practices говорят об использовании натуральных ключей для методов equals/hashCode. У нас есть составной ключ, который состоит из 2 параметров (например, String name, Organization org), к которым принадлежит определенный объект. К сожалению, я не могу использовать org, поскольку он лениво загружен и приводит к другим проблемам, и я также не хочу создавать суррогатный ключ (возможно, автоматически созданный из базы данных или UUID, созданный с помощью вызова API до создания объекта). Какие параметры у меня есть, поскольку в указанных выше объектах (имя, org) поля уникальны, и я не могу просто написать свою логику только на основе самого поля имени. Является ли суррогатный ключ единственным вариантом, означает ли это, что я должен хранить это значение как часть каждой строки таблицы?Использование натуральных ключей как части равных и hashCode
ответ
Рекомендации по использованию Hibernate говорят об использовании натуральных ключей для методов equals/hashCode.
Да, поэтому я не буду подробно останавливаться на этом.
У нас есть составной ключ, который состоит из двух параметров (например, имя строки, организация org), к которому принадлежит определенный объект. К сожалению, я не могу использовать org, так как он лениво загружен и приводит к другим проблемам.
Не могли бы вы немного разобраться и проиллюстрировать каким-то кодом? Я хотел бы понять, как вы это сделали, и в чем проблема.
Какие варианты у меня есть с тех пор, как в указанных выше объектах (имя, org) поля уникальны, и я не могу просто написать свою логику только на основе самого поля имени.
Как я уже говорил, предоставление более подробной информации может помочь. Но на всякий случай обратите внимание, что вызов org.getId()
на прокси не должен запускать загрузку объекта, если вы используете property access type, чтобы вы могли использовать его в своей реализации равным образом.
Что называется названным объектом и организацией? Я предполагаю, что это называется Foo. Я так понимаю, вы не можете сказать foo.getOrganization(), потому что соединение с базой данных закрыто? Можете ли вы изменить свой FooDAO, чтобы он загружал Организацию, как только foo читается из базы данных?
Затем он будет доступен позже, когда вам нужно что-то сделать с помощью equals() и hashCode().
Если вы хотите что-то вроде
public class MyEntity {
private String name;
private Organization organization;
// getter's and setter's
public boolean equals(Object o) {
if(!(o instanceof MyEntity))
return false;
MyEntity other = (MyEntity) o;
return new EqualsBuilder().append(getName(), other.getName())
.append(getOrganization(), other.getOrganization())
.isEquals();
}
}
Но если вы хотите, чтобы избежать этого, потому что вы теперь хотите загрузить ленивый загруженный объект, вы можете рассчитывать на Hibernate.isInitialized методе и поставить свой обычай рутина
public boolean equals(Object o) {
if(!(o instanceof MyEntity))
return false;
MyEntity other = (MyEntity) o;
boolean equals = new EqualsBuilder().append(getName(), other.getName())
.isEquals();
if(Hibernate.isInitialized(getOrganization())) {
// loaded Organization
} else {
// supply custom routine
}
return equals;
}
у меня есть не обновляемый веб-страницу, где Hibernate поставку следующей матрицы
no eq/hC at all eq/hC with the id property eq/hC with buisness key
use in a composite-id No Yes Yes
multiple new instances in set Yes No Yes
equal to same object from other session No Yes Yes
collections intact after saving Yes No Yes
Где различные проблемы заключаются в следующем:
использование в составном-ID:
использовать объект в качестве составного-идентификатора, он должен осуществить равных/хэш-код в некотором роде == идентичности в этом случае будет недостаточно.
несколько новых экземпляров в комплекте:
Будет ли следующая работа или нет:
HashSet someSet = new HashSet();
someSet.add(new PersistentClass());
someSet.add(new PersistentClass());
assert(someSet.size() == 2);
равным тому же объекту из другого сеанса:
Будет ли следующая работа или нет:
PersistentClass p1 = sessionOne.load(PersistentClass.class, new Integer(1));
PersistentClass p2 = sessionTwo.load(PersistentClass.class, new Integer(1));
assert(p1.equals(p2));
коллекции нетронутыми после сохранения:
Будет ли следующая работа или нет:
HashSet set = new HashSet();
User u = new User();
set.add(u);
session.save(u);
assert(set.contains(u));
Он также выделить этот Thread где равна реализации/Hashcode сильно обсуждается
IMHO, проблема заключается в реализации hashCode ион. Интересно, как OP мог реализовать (согласованный) хэш-код с его ленивой загруженной Организацией. –
- 1. Использует hashCode для реализации равных нет?
- 2. Поиск ключей, равных значениям, которые не работают
- 3. Написание методов hashCode для гетерогенных ключей
- 4. равных ключей триггер загружает больше, чем ожидалось
- 5. HashMap - не возвращает правильное значение для равных ключей
- 6. Использование натуральных идентификаторов (например, адрес электронной почты)
- 7. Использование равных и == на LocalDate Object
- 8. Авто Приращение натуральных ключей с помощью django/postgres
- 9. Flink-CEP использование hashCode и равно
- 10. могут использоваться в равных и хэш-кодах?
- 11. Использование hashcode для уникального ID
- 12. Как мне переопределить метод equals и hashcode, чтобы избежать добавления равных объектов o HashSet?
- 13. Использование равных в общем методе
- 14. Использование равных операторов в C#
- 15. многоразовая реализация равных и хэш-код
- 16. Использование Map.remove и список ключей
- 17. как разделить 3 равных части li в html
- 18. Как связаны hashcode() и compareTo()?
- 19. Java: Карта с типом doubleKey, как сделать правильный hashCode()?
- 20. Как создать метод равных
- 21. Как один блок тестирует контракт hashCode-equals?
- 22. HashCode для изменяемого объекта
- 23. Генератор последовательности натуральных чисел
- 24. Как создать ToString и методы Hashcode чествование правила Checkstyle
- 25. Каков правильный способ переопределения равных и hashcode, где любая из двух переменных может быть одинаковой?
- 26. Equal и hashcode в унаследованном классе
- 27. Карта HashCode и Equals
- 28. java hashcode и равно
- 29. Квадратный корень натуральных чисел?
- 30. Плохая производительность на Quicksort, Dual Pivot, много равных ключей
Up для определения собственности которая позволяет пользователю получить идентификатор связанного объекта без попадания в базу данных –