2014-09-02 2 views
1

В 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(); 
    } 
} 
+0

Вы должны выяснить, что в Hibernate стратегия генерации ID для вашей стратегии наследования по MySQL (вероятно TABLE) и убедитесь, как вы распределяете идентификаторы в вашем SQL совместим с этим стратегия. – Eelke

+0

@Eelke Пожалуйста, смотрите код для «BaseEntity» по ссылке выше. Вот соответствующий сегмент: '@Id @GeneratedValue (strategy = GenerationType.TABLE) защищенный идентификатор Integer;' Все SQL DDL создается 'hbm2ddl'. Вам нужно увидеть инструкции SQL 'INSERT', которые генерируются спящим режимом? Что я могу предоставить, что может помочь вам увидеть конкретное решение в форме кода? – CodeMed

ответ

1

Я никогда не делал это с помощью гибернации или MySQL ут сделали нечто подобное с EclipseLink + PostgreSQL. Таким образом, могут быть некоторые ошибки ниже.

С типом типа TABLE вы можете явно указать некоторые дополнительные параметры, используя аннотацию TableGenerator. Таким образом, вы уверены, что спящий режим хранит вещи.

@Id 
@GeneratedValue(
    strategy=GenerationType.TABLE, 
    generator="TBL_GEN") 
@javax.persistence.TableGenerator(
    name="TBL_GEN", 
    table="GENERATOR_TABLE", 
    pkColumnName = "mykey", 
    valueColumnName = "hi" 
    pkColumnValue="BaseEntity_Id", 
    allocationSize=20 
) 

Что вам нужно сделать, когда вы обходите спящий режим, чтобы резервировать идентификаторы нужно обновляя строку с MYKEY BaseEntity_Id в таблице GENERATOR_TABLE.

Для получения дополнительной информации по аннотациям см paragraph 5.1.2.2

+0

Должен был знать, что лучший ключ действительно является стандартным ключевым словом SQL. Обновлен ответ. – Eelke

+0

Поскольку я более подробно рассматриваю это, я вижу, что 'generator_table' до сих пор не учитывает ранее существовавшие значения ключей, которые были импортированы в базу данных из внешних скриптов. Это не решит мою проблему, если только спящий режим не сможет проверить ранее существовавшие значения ключей перед установкой/использованием значения в 'hi'. – CodeMed

Смежные вопросы