Я фактически добавляю функциональность в продукт (интенсивное использование Hibernate и Spring), и мне нужно изменить фактическое отображение Hibernate, вот в чем дело:
класс "Mother"
сущности (абстрактный) иназывается AbstractElement
<class abstract="true" dynamic-insert="true" dynamic-update="true" name="fr.g.n.a.domain.instances.AbstractElement"
table="AEL_ABSTRACT_ELEMENT">
<cache usage="read-write" />
<id name="oid" type="string">
<column length="64" name="OID" />
<generator class="assigned" />
</id>
<discriminator column="TYPELEMENT" type="string" not-null="false" force="true" />
<!-- Version hibernate de l'objet persisté : -1 signifie que l'objet n'est pas présent en base -->
<version name="version" unsaved-value="negative">
<column name="VERSION" />
</version>
подклассом (не абстрактным), который расширяет концепцию, называемую "ElementNiveauUn"
, вот фрагмент этого отображения
<joined-subclass dynamic-insert="true" dynamic-update="true" name="fr.g.n.a.domain.instances.ElementNiveauUn"
table="ENU_ELEMENT_NIVEAU_UN" abstract="true" lazy="false" extends="fr.generali.nova.atp.domain.instances.AbstractElement">
<key column="OID" not-null="true" foreign-key="FK_ENU_AEL_OID" />
до тех пор, пока здесь все не будетработает хорошо, ничего особенного, чтобы упомянуть о классах Java, вот моя проблема:
Мне нужно добавить класс (не абстрактный), который расширяет ElementNiveauUn
, чтобы наследовать от него, и так от "AbstractElement"
.
Фрагмент сопоставления выглядит следующим образом:
<subclass name="fr.g.n.a.domain.parametrage.Critere" extends="fr.g.n.a.domain.instances.ElementNiveauUn" >
<subclass dynamic-insert="true" dynamic-update="true" name="fr.g.n.a.parametrage.CritereProduit" abstract="false" lazy="false"
extends="fr.g.n.a.domain.parametrage.Critere" discriminator-value="CRITERE_PRODUIT">
</subclass>
<subclass dynamic-insert="true" dynamic-update="true" name="fr.g.n.a.domain.parametrage.Segmentation" abstract="false" lazy="false"
extends="fr.g.n.a.atp.domain.parametrage.Critere" discriminator-value="SEGMENTATION">
</subclass>
<subclass dynamic-insert="true" dynamic-update="true" name="fr.g.n.a.domain.parametrage.CritereApporteur" abstract="false" lazy="false"
extends="fr.g.n.a.atp.domain.parametrage.Critere" discriminator-value="CRITERE_APPORTEUR">
</subclass>
, когда я пытаюсь сохранить экземпляр сегментации, у меня есть такое исключение (с использованием H2 иUDBUnit)
Причина: org.h2.jdbc.JdbcSQLException: NULL не допускается для столбца "ID_ELEMENT_NIVEAU_UN";Оператор SQL: вставьте в ENU_ELEMENT_NIVEAU_UN (OID) значения (?) [23502-154]
, и сгенерированный SQL для вставки сегментации выглядит следующим образом
insert into ENU_ELEMENT_NIVEAU_UN (OID) values (?)
Кажетсячто он рассматривал Segmentation
как ElementNiveauUn
, но из-за ENU_ELEMENT_NIVEAU_UN
равен not-null="true"
в отображении ElementNiveauUn
, он ожидает установить значение, которое я уже сделал, но кажется, что оно потеряно в процессе вставки
Вот упрощенная диаграмма классов UML : http://goo.gl/vOHHC