表加入JPA - 创建包含Join的实体

时间:2013-06-28 21:47:31

标签: java jpa ejb entities jointable

我有一个名为“人”的实体。它由表pers_addr_tb加入到Address实体。 所以Person实体看起来像这样

@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,然后创建一些Address实体。 如果pers_addr_tb不存在会发生什么?它是在创建人员和地址时创建的吗?

为了进行测试,我们使用内存中的HSQL db(使用OpenEJB)。因此,我们需要根据需要动态创建实体。 但pers_addr_tb未定义为实体。

2 个答案:

答案 0 :(得分:0)

您创建一个Person实例并将其保留。 JPA在人员表中插入一行。

然后创建一个Address实例并保留它。 JPA在地址表中插入一行。

然后将地址添加到人员的地址列表中,Hibernate在连接表中插入一行。

事实上这是部分正确的,因为插入实际上是在提交事务时完成的。但是像JPA这样的ORM的原则是你在实体中指定的映射告诉JPA必须如何以及在何处保持实体及其关联。

答案 1 :(得分:0)

Apache OpenJPAOpenEJB捆绑在一起作为默认持久性提供程序。有关注释@JoinTable的详细信息,请参阅manual

中的8.5. Join Table

如果映射注释中没有错误,一旦加载了OpenJPA,这可能会在数据库中自动生成或修改表。您需要在persistence.xml下添加下一个属性:

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

有关此问题的详细信息,请参阅1.3. Runtime Forward Mapping中的manual部分。