tags:

views:

62

answers:

2

Suppose I've these 2 classes:

class A{

    B ref1 = null; //Can both be null
    B ref2 = null;

}

class B{

    ..
}

I'm omitted the getters and setters for ref1 and ref2. Of course I want to add ids... Anyway what I want is to have hibernate handle automatic persistence of these two references... and to have automatic deletion of B objects. I thought of using one-to-one between each property ref* of A and B. But I got lost :) Can you give suggestions? I want to use SchemaExport.

Thank you.

+1  A: 

you can achieve this behaviour by using the Cascade property of the OneToOne-Annotation. so with Hibernate Annotations / JPA Annotations youd 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 wanted behaviour in cascading persistence operations onto the BClasses and delete any nonreferenced BClass Objects from the persistence layer.

Have Fun!

Frank

smeg4brains
thanks but I was looking for xml based mapping...
gotch4
moreover are you sure that it is safe to use one-to-one isn't it one to many for A?
gotch4
well that depends on the data model, if you have one and only one reference from one AClass to one BClass it works, even if there are 2 fields holding BClasses in AClass. they just shouldnt be referencing the same instance
smeg4brains
A: 

Hi,

You have a @OneToMany relationship. But you have to adapt ORM to your model because of There is no @OneToTwo relationship 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>

Now your ClassAa 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;
    }

}

regards,

Arthur Ronald F D Garcia