休眠,保持对“父”对象
问题描述:
我有休眠的经验非常少,所以这可能是一个合适的新手问题:休眠,保持对“父”对象
为了使这个问题简单的,比方说我有两种类型的对象,家庭和人。一个家庭由几个人组成。
如果我有一个一对多的关系定义为家庭对人,那么两者之间的关系将被包含在人表中,作为外键。然后我会假设将人们添加到家庭中,然后保存家庭对象就足以将这种关系存入数据库。但是,这似乎并不是这种情况。
我现在要做的是:
1)增加对家庭的提及一个一对多的关系,这给了我必要的方法,以人添加或删除家庭对象。
2)在人物上添加一对一的关系给家人,这使我可以从这个人中引用家人。
3)然后,我继续将此人物对象与手动设置的家庭参照添加到家庭对象。然后我保存家庭对象。
这看起来很麻烦,也是错误的。有没有更好的方法来做到这一点?
答
至于Family
到Person
是一对多的关系,Family
类应该有一个集合属性(例如列表)来保存其Person
的集合。
您可以封装的方法添加Person
时将Family
,例如Family
和Person
之间设置引用的过程中,一种称为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**/
}
@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();
答
你在做什么没什么错,它被称为逆映射。它甚至在逻辑上是正确的。
在Person.java
Family family;
在Family.java
List<Persons> familyMembers; //or any other collection.
如果不需要为家庭上逆参照个人你可以将其删除。你可以尝试一个例子here。
问题是我不知道我是否需要'人'上的'家族'的反向引用。 我想也许从'Family'到'Person'的一对多就足以在'Person'中填充外键,但那不是我得到的行为。每当我坚持一个带有一个或多个新人的'Family'时,外键在db中简单地设置为null,因此两者之间的关系不会持久。 – rogerkk 2012-03-27 07:25:56