В Spring MVC приложения, с помощью Hibernate, JPA и MySQL, у меня есть BaseEntity
, который содержит id
поля, которое является уникальным для всех классов, которые наследуют от BaseEntity
, используя @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
. Некоторые данные импортируются в базу данных MySQL с использованием внешнего файла dml.sql
из командной строки. Импортируемые данные тщательно планируются таким образом, чтобы все id
s, которые должны управляться как часть группы наследования BaseEntity
, уникальны в своей группе наследования.избыточных значений идентификаторов вставленных несмотря на использование @inheritance
Проблема заключается в том, что hibernate не учитывает значения id
s уже в базе данных при вставке новой записи в базу данных. Вместо этого спящий режим сохраняет значение id
в одном из потомковых объектов, которое идентично id
, хранящемуся в одном из других дочерних объектов.
Как настроить hibernate для оценки значений id
уже в базе данных при сохранении нового объекта в пределах одной группы наследования?
Некоторые соответствующие факты:
Все объекты в базе данных MySQL были созданы непосредственно из Hibernate отображения в приложении с помощью hbm2ddl
.
Я не могу использовать @MappedSuperClass
для BaseEntity
потому BaseEntity
используется как свойство одного из объектов в приложении, так что объекты разных типов могут быть сохранены в том же свойстве этого объекта. Когда я использовал @MappedSuperClass
, eclipse выдавал ошибки компиляции, говоря, что BaseEntity
не может быть создан непосредственно, потому что у него есть @MappedSuperClass
аннотация.
Примечание: Сайт для обмена файлами, по-видимому, является центром, оправдывающим весь код. Вы можете исправить это, просто вырезая и вставив его в текстовый редактор.
Вы можете прочитать код для BaseEntity by clicking on this link.
Код для объекта, значения id которого неверно заданы с помощью спящего режима, можно прочитать, нажав on this link.
jpql код для сохранения лица, чей идентификатор быть установлен неправильно выглядит следующим образом:
@Override
@Transactional
public void saveCCD(HL7ConsolidatedCareDocument ccd) {
if (ccd.getId() == null) {
this.em.persist(ccd);
this.em.flush();
}
else {
this.em.merge(ccd);
this.em.flush();
}
}
Вы должны выяснить, что в Hibernate стратегия генерации ID для вашей стратегии наследования по MySQL (вероятно TABLE) и убедитесь, как вы распределяете идентификаторы в вашем SQL совместим с этим стратегия. – Eelke
@Eelke Пожалуйста, смотрите код для «BaseEntity» по ссылке выше. Вот соответствующий сегмент: '@Id @GeneratedValue (strategy = GenerationType.TABLE) защищенный идентификатор Integer;' Все SQL DDL создается 'hbm2ddl'. Вам нужно увидеть инструкции SQL 'INSERT', которые генерируются спящим режимом? Что я могу предоставить, что может помочь вам увидеть конкретное решение в форме кода? – CodeMed