Как сопоставить эти классы с Hibernate? - PullRequest
4 голосов
/ 10 февраля 2010

Предположим, у меня есть эти 2 класса:

class A{

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

}

class B{

    ..
}

Я опущен геттеры и сеттеры для ref1 и ref2. Конечно, я хочу добавить идентификаторы ... В любом случае, я хочу, чтобы Hibernate обрабатывал автоматическое сохранение этих двух ссылок ... и автоматическое удаление объектов B. Я думал об использовании один-к-одному между каждым свойством ref * для A и B. Но я заблудился :) Можете ли вы дать предложения? Я хочу использовать SchemaExport.

Спасибо.

Ответы [ 2 ]

1 голос
/ 10 февраля 2010

Вы можете достичь этого поведения, используя свойство Cascade в OneToOne-Annotation. так с 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>

Это должно дать вам требуемое поведение в каскадных операциях сохранения на BClasses и удалить все не связанные объекты BClass из уровня сохранения.

Веселись!

Frank

0 голосов
/ 11 февраля 2010

У вас есть отношения @OneToMany. Но вы должны адаптировать ORM к вашей модели, потому что нет отношения @OneToTwo.

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

}

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...