Hi,
I have few doubts on inheritance.
Code:
ClassA {
String id;
List<ClassB> childs;
ClassAComment classAcomment;
}
ClassB{
String id;
ClassBComment classBcomment;
}
I would like to store the field values which are having >500 size in TestComments.
TestComment:Code:
COMMENT_ID PK
PARENT_ENTITY_ID not null
ENTITY_ID not null
ENTITY_FIELD_CD not null
fieldValue
at the database level i don't have any foriegn key constraint on parentId and entityId, but i am trying to enforce them at hibernate mapping level like:
Code:
ClassA mapping:
<class name="ClassA" table="TableA">
<id name="id" type="string">
<column name="TABLEA_ID" length="15" />
<generator class="sequence">
<param name="sequence">TEST_SEQ</param>
</generator>
</id>
<one-to-one name="classAcomment"
class="ClassAComment"
cascade="all" property-ref="entityId" />
<bag name="childs" inverse="true" cascade="all">
<key>
<column name="TABLEA_ID" length="15" not-null="true" />
</key>
<one-to-many class="ClassB" />
</bag>
</class>
ClassB mapping:
<class name="ClassB" table="TableB">
<id name="id" type="string">
<column name="TABLEB_ID" length="15" />
<generator class="sequence">
<param name="sequence">TEST_SEQ</param>
</generator>
</id>
<one-to-one name="classBcomment"
class="ClassABomment"
cascade="all" property-ref="entityId" />
<many-to-one name="classA" class="ClassA" fetch="select">
<column name="TABLEA_ID" length="15" not-null="true" />
</many-to-one>
</class>
TestComments mapping:
<class name="TestComment"
table="O_TEST_COMMENT">
<id name="commentId " type="string">
<column name="COMMENT_ID" length="15" />
<generator class="sequence">
<param name="sequence">TEST_SEQ</param>
</generator>
</id>
<discriminator force="true" type="string">
<column name="ENTITY_FIELD_CD" length="32" not-null="true" />
</discriminator>
<subclass name="ClassAComment"
discriminator-value="CLASSA_COMMENT">
<many-to-one name="parentEntityId"
class="ClassA" lazy="false">
<column name="PARENT_ENTITY_ID" length="15"
not-null="true" />
</many-to-one>
<many-to-one name="entityId"
class="ClassA" lazy="false">
<column name="ENTITY_ID" length="15"
not-null="true" />
</many-to-one>
</subclass>
<subclass
name="ClassBComment"
discriminator-value="CLASSB_COMMENT">
<many-to-one name="parentEntityId"
class="ClassA" lazy="false">
<column name="PARENT_ENTITY_ID" length="15"
not-null="true" />
</many-to-one>
<many-to-one name="entityId"
class="ClassB" lazy="false">
<column name="ENTITY_ID" length="15"
not-null="true" />
</many-to-one>
</subclass>
.......
</class>
I am duplicating one selected ClassA object along with its child by setting Id to null and tried merge on ClassA, the queries generated in the following order:
first insert on ClassA
insert on ClassAComment
insert on ClassBComment (here i am getting exception)
Hibernate is trying to insert child(ClassBComment) first before Parent(ClassB), is there any way to tell hibernate to insert parent first.
caused by: org.hibernate.PropertyValueException: not-null property references a null or transient value: com.test.domain.ClassBComment.entityId
at org.hibernate.engine.Nullability.checkNullability(Nullability.java:72)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:290)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:94)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:507)
at org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:499)
at org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:218)
at org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:268)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:216)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
at org.hibernate.engine.Cascade.cascadeCollectionElements(Cascade.java:296)
at org.hibernate.engine.Cascade.cascadeCollection(Cascade.java:242)
at org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:219)
at org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:169)
at org.hibernate.engine.Cascade.cascade(Cascade.java:130)
at org.hibernate.event.def.AbstractSaveEventListener.cascadeAfterSave(AbstractSaveEventListener.java:456)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:334)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:181)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:121)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
at org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:693)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
... 120 more