How to match these classes with Hibernate?

Suppose I have these 2 classes:

class A{ B ref1 = null; //Can both be null B ref2 = null; } class B{ .. } 

I skipped getters and seters for ref1 and ref2. Of course, I want to add identifiers ... Anyway, I want hibernate to handle the automatic preservation of these two links ... and to automatically delete objects B. I thought about using a one-to-one relationship between each ref * property from A and B. But I am lost :) Can you give suggestions? I want to use SchemaExport.

Thanks.

+4
source share
2 answers

You can achieve this behavior using the Cascade property of OneToOne-Annotation. therefore with Hibernate / JPA annotations. You have something like:

 @Entity public class AClass{ @Id @GeneratedValue private long id; @OneToOne(cascade={Cascade.ALL, Cascade.DELETE_ORPHANS}) private BClass b_1; @OneToOne(cascade={Cascade.ALL, Cascade.DELETE_ORPHANS}) private BClass b_2; } @Entity public class BClass{ private String someField; } 

in an XML mapping, the association should look something like this:

 <hibernate-mapping> <class name="AClass"> <one-to-one cascade="all,delete-orphans" name="b_1" class="BClass" /> <one-to-one cascade="all,delete-orphans" name="b_2" class="BClass" /> </class> </hibernate-mapping> 

This should give you the desired behavior in cascading save operations on BClasses and remove any undescribed BClass objects from the save level.

Good luck

Franc

+1
source

You have a @OneToMany relationship. But you have to adapt ORM to your model due to the lack of @OneToTwo relationships available.

  <hibernate-mapping> <class name="ClassAa"> <list name="classBbList"> <key column="CLASS_AA_ID" not-null="true"/> <list-index column="CLASS_BB_INDEX"/> <one-to-many class="ClassBb"/> </list> </class> <hibernate-mapping> 

Your ClassAa now looks like

 public class ClassAa { private ClassBb classBb1; private ClassBb classBb2; private List<ClassBb> classBbList = new ArrayList<ClassBb>(); public void setClassBb1(ClassBb classBb1) { // You can use index 0 to store your classBb1 if(getClassBbList().size == 0) getClassBbList().add(classBb1); else getClassBbList().set(0, classBb1); } public ClassBb getClassBb1() { if(getClassBbList().size() == 0) return null; return getClassBbList().get(0); } public void setClassBb2(ClassBb classBb2) { // You can use index 1 to store your classBb2 switch(getClassBbList().size()) { case 0: getClassBbList().add(null); getClassBbList().add(classBb2); break; case 1: getClassBbList().add(classBb2); break; case 2: getClassBbList().set(1, classBb2); break; } } public ClassBb getClassBb2() { if(getClassBbList().size() < 2) return null; return getClassBbList().get(1); } public List<ClassBb> getClassBbList() { return this.classBbList; } public void setClasBbList(List<ClassBb> classBbList) { this.classBbList = classBbList; } } 

Respectfully,

0
source

Source: https://habr.com/ru/post/1300876/


All Articles