2012-03-26 98 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