2012-03-26 95 views
1

我有休眠的经验非常少,所以这可能是一个合适的新手问题:休眠,保持对“父”对象

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

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

我现在要做的是:

1)增加对家庭的提及一个一对多的关系,这给了我必要的方法,以人添加或删除家庭对象。

2)在人物上添加一对一的关系给家人,这使我可以从这个人中引用家人。

3)然后,我继续将此人物对象与手动设置的家庭参照添加到家庭对象。然后我保存家庭对象。

这看起来很麻烦,也是错误的。有没有更好的方法来做到这一点?

回答

2

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

您可以封装的方法添加Person时将Family,例如FamilyPerson之间设置引用的过程中,一种称为addPerson()。你的FamilyPerson类看起来是这样的:

@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**/ 
} 

@Entity 
public class Person{ 

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

    /**getter and setter**/ 

} 

然后用于增加人到现有的家庭(ID = 1):

session.beginTransaction(); 
Family family = (Family)session.get(Family.class, 1); 
Person person = new Person(); 
person.set(xxxx); 
family.addPerson(person); 
session.getTransaction().commit(); 
1

你在做什么没什么错,它被称为逆映射。它甚至在逻辑上是正确的。

Person.java

Family family; 

Family.java

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

如果不需要为家庭逆参照个人你可以将其删除。你可以尝试一个例子here

+0

问题是我不知道我是否需要'人'上的'家族'的反向引用。 我想也许从'Family'到'Person'的一对多就足以在'Person'中填充外键,但那不是我得到的行为。每当我坚持一个带有一个或多个新人的'Family'时,外键在db中简单地设置为null,因此两者之间的关系不会持久。 – rogerkk 2012-03-27 07:25:56