如何使用Hibernate映射这些类?

时间:2010-02-10 14:59:08

标签: java hibernate

假设我有这两个类:

class A{

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

}

class B{

    ..
}

我省略了ref1和ref2的getter和setter。当然我想添加id ...无论如何我想要的是让hibernate处理这两个引用的自动持久性......以及自动删除B对象。我想在A和B的每个属性ref *之间使用一对一但是我迷路了:)你能给出建议吗?我想使用SchemaExport。

谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用OneToOne-Annotation的Cascade属性来实现此行为。所以使用Hibernate Annotations / JPA Annotations你会有类似的东西:

@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;
}

在XML映射中,关联应该如下所示:

<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>

这应该在级联持久性操作中为您提供所需的行为,并从持久层中删除任何未引用的BClass对象。

玩得开心!

答案 1 :(得分:0)

您有@OneToMany关系。但是由于没有@OneToTwo关系,你必须使ORM适应你的模型。

 <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>

现在你的ClassAa看起来像

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;
    }

}

的问候,