2011-02-26 85 views
8

我有雙向,一對多和多對一的關係。比方說,一個公司有很多的人,和一個人有一個公司,所以,在公司,JPA OneToMany,始終爲空

@OneToMany(mappedBy = "company", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
private Collection<Person> persons; 

和人,

@ManyToOne 
@JoinColumn(name="COMPANY_ID") 
private Company company; 

現在,說我有一個@PrePersist/@PreUpdate方法在公司,在那裏當它被更新,我想設置上所有的人相同的時間戳...像,

@PrePersist 
@PreUpdate 
public void setLastModified() { 
    this.lastModified = System.currentTimeMillis(); 
    if (persons != null) { 
     for (Person person : persons) { 
      person.setLastModified(this.lastModified); 
     } 
    } 
} 

當我調試此,筆者看到,在公司人員現場總是空的。當我查看個人集合的類型時,它是一個java.util.Vector。不確定這是否相關。我期望看到一些自動加載的JPA集合類型。

我在做什麼錯?

回答

0

將fetch = FetchType.Eager添加到@ManyToOne批註。你在關係的另一面添加了它。

+0

感謝。我還沒有機會驗證這一點,但當我這樣做時,我會更新這個問題。 – 2011-03-06 17:36:10

+3

這並不能解決問題。 – 2011-03-10 17:47:57

0

如果您想獲得personListCompany,請使用FetchType.EAGER。 在JPA中,

@--ToOne => Default : FetchType.EAGER 
@--ToMany => Default : FetchType.LAZY 

@JoinColumn(name="COMPANY_ID", fetch = FetchType.EAGER) 
private Company company; 
2

您必須設置雙方的關係。當您創建新人並設置公司時,您還必須將該人添加到公司的人員(員工?)。另外,你不應該改變一個對象的prePersist/Update中的另一個對象,你應該使用它自己的prePersist/Update事件。

見, http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_side

+0

我打算用這個鏈接指定的基本版本添加我自己的破解版,但我不知道它實際上是專家建議的方法。 – blagae 2015-01-02 16:01:39