2013-06-28 37 views
1

我有一個名爲「Person」的實體。其加入表pers_addr_tbAddress實體。 所以Person實體看起來像這樣表加入JPA - 創建包含加入的實體

@ManyToMany(fetch = FetchType.EAGER) 
@Fetch(FetchMode.SUBSELECT) 
@JoinTable(name = "pers_addr_tb", joinColumns = @JoinColumn(name = "pers_ID"), 
          inverseJoinColumns = @JoinColumn(name = "addr_ID")) 
public List<Address> addresses; 

現在可以說,我先創建Person一些地址實體。 如果pers_addr_tb不存在,會發生什麼情況?創建人員和地址時是否創建?

爲了測試,我們使用內存中的HSQL數據庫(使用OpenEJB)。所以我們需要根據需要隨時創建實體。 但是pers_addr_tb未定義爲實體。

+0

這些表是否不存在於數據庫中,並且您希望使用元數據生成它們? –

+0

@PaulVargas,是的。那就對了。這些表不存在。 –

回答

0

您創建一個Person實例並保存它。 JPA在人員表中插入一行。

然後,您創建一個Address實例並保存它。 JPA在地址表中插入一行。

然後,您將地址添加到人員的地址列表中,Hibernate將在連接表中插入一行。

這實際上是部分正確的,因爲插入事實上會在您提交事務時完成。但是像JPA這樣的ORM原理是,您在實體中指定的映射告訴JPA實體及其關聯必須如何以及何處保持。

0

Apache OpenJPAOpenEJB捆綁爲默認持久性提供程序。有關注釋@JoinTable的詳細信息,請參閱manual8.5. Join Table

如果在映射註解沒有錯誤,一旦加載OpenJPA中,這可能會產生或數據庫中自動修改表。您需要在persistence.xml下一個屬性添加:

<property name="openjpa.jdbc.SynchronizeMappings" 
      value="buildSchema(ForeignKeys=true)" /> 

有關更多細節,請參見1.3. Runtime Forward Mapping中的manual