1

我有一个名为“人”的实体。它通过表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 不存在会怎样?它是在创建 Person 和 Address 时创建的吗?

为了测试,我们使用内存中的 HSQL db(使用 OpenEJB)。所以我们需要根据需要动态创建实体。但是 pers_addr_tb 没有被定义为实体。

4

2 回答 2

0

您创建一个 Person 实例并将其持久化。JPA 在 person 表中插入一行。

然后创建一个 Address 实例并将其持久化。JPA 在地址表中插入一行。

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

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

于 2013-06-28T22:12:38.777 回答
0

Apache OpenJPA作为默认持久性提供程序与OpenEJB捆绑在一起。关于注解的详细信息@JoinTable,请参见8.5中的手册。加入表

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

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

有关这方面的更多详细信息,请参阅第1.3 节。手册中的运行时正向映射

于 2013-06-28T22:30:53.590 回答