Hibernate,保持对“父”对象的引用

时间:2012-03-26 11:38:10

标签: hibernate hibernate-mapping

我对hibernate的经验很少,所以这可能是一个适当的新手问题:

为了简单地说明这个问题,我想说我有两种类型的对象,家庭和人。一个家庭由几个人组成。

如果我在家庭中定义了一对多关系,那么两者之间的关系将作为外键包含在人员表中。然后我假设将人员添加到系列中,然后保存系列对象,就足以将这种关系引入数据库。但是,情况似乎并非如此。

我目前要做的是:

1)在家庭中添加上述一对多关系,这为我提供了向家庭对象添加或删除人员的必要方法。

2)在人物对象上添加多对一关系给家庭,这使我可以从这个人那里引用这个家庭。

3)然后我继续使用手动设置的族参考将此人物对象添加到族对象。然后我保存了家庭对象。

这看起来真的很麻烦和错误。有没有更好的方法呢?

2 个答案:

答案 0 :(得分:2)

由于FamilyPerson是一对多的关系,Family类应该有一个集合属性(例如,A List)来保存其Person的集合。

在方法中向Family添加Person时,您可以封装在PersonFamily之间设置引用的过程,例如,名为{的方法{1}}。您的addPerson()Family类看起来像这样:

Person

@Entity
public class Family{

    @OneToMany(cascade = CascadeType.ALL, mappedBy="family")
    private List<Person> personList = new ArrayList<Person>();

    public void addPerson(Person personToAdd){
        this.personList.add(personToAdd);
        personToAdd.setFamily(this);
    }

   /**getter and setter**/
}

然后将Person添加到现有族(ID = 1):

@Entity
public class Person{

    @JoinColumn(name="family_id")
    @ManyToOne
    private Family family;

    /**getter and setter**/

}

答案 1 :(得分:1)

您正在做的事情没有错,它被称为逆映射。这在逻辑上是正确的。

Person.java

Family family;

Family.java

List<Persons> familyMembers; //or any other collection.

如果上的家庭不需要反向引用,则可以将其删除。您可以尝试示例here