2013-05-31 89 views
3

我有兩個非常簡單的對象,一個對象應包含在一組的「一個一對多」關係,另一個。對象在數據庫中正確插入,但「子」表中的外鍵始終爲「null」。休眠 - 一對多的關係 - 外鍵總是「空」

我想不通爲什麼:

這是測試對象,並在其設定的保持孩子:

@Entity 
@Table(name="test") 
public class TestObj { 

    public TestObj(){} 

    private Long id; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    public Long getId() { 
     return id; 
    } 
    public void setId(Long id) { 
     this.id = id; 
    } 

    private Set<Children> children = new HashSet<Children>(); 

    @OneToMany(mappedBy = "testObj", cascade = CascadeType.ALL) 
    public synchronized Set<Children> getChildren() { 
     return children; 
    } 
    public synchronized void setChildren(Set<Children> children) { 
     this.children = children; 
    } 
    public void addChildren(Children child){ 
     children.add(child); 
    } 
} 

這是孩子們對象,並將其持有後鏈接到 「TestObj」:

@Entity 
@Table(name = "children") 
public class Children { 

    public Children(){} 

    private Long id; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    private TestObj testObj; 

    @ManyToOne 
    @JoinColumn 
    public TestObj getTestObj() { 
     return testObj; 
    } 

    public void setTestObj(TestObj testObj) { 
     this.testObj = testObj; 
    } 
} 

我堅持使用此代碼這個對象:

EntityManagerFactory entityManagerFactory = HibernateEntityMangerSingelton.getEntityManagerFactory(); 
EntityManager entityManager = entityManagerFactory.createEntityManager(); 
entityManager.getTransaction().begin(); 


TestObj user = new TestObj(); 

Children child = new Children(); 
user.addChildren(child); 
try { 

    entityManager.persist(user); 

    entityManager.getTransaction().commit(); 

} catch (Exception e) { 
    System.out.println(e); 
}finally{ 
    entityManager.close(); 
} 

有些人可以解釋爲什麼會發生這種情況嗎?

+0

你可以發表你的答案? – Rajesh

回答

5

這很簡單:你永遠不會初始化Children(應該命名爲Child,BTW)中的testObj字段。 Children.testObj是關聯的所有者,並且是映射到連接列的字段,因此如果它爲null,則連接列將爲空。

+0

謝謝!你是對的,那真的很簡單,我試過一切:(我應該去睡覺! – jan

+0

你可以請你發佈你的代碼嗎?我試過相同的,但仍空 – Rajesh

0

我有我通過調用業主方的制定者解決了類似的問題。 2. metods塞汀和增加孩子們的TestObj應該改變這樣的,從而使TestObj是在業主方初始化:

public synchronized void setChildren(Set<Children> children) 

{ 



this.children = children; 


for(Children child : children) 
    { 
    // initializing the TestObj instance in Children class (Owner side) so that it is not a null and PK can be created 
      child.setTestObj(this); 
    } 
    } 

第二種方法:

public void addChildren(Children child) 
{ 
    children.add(child); 
//Intializing the TestObj instance at the owner side 
    child.setTestObj(this); 
}