我有一个名为“人”的实体。它由表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未定义为实体。
答案 0 :(得分:0)
您创建一个Person实例并将其保留。 JPA在人员表中插入一行。
然后创建一个Address实例并保留它。 JPA在地址表中插入一行。
然后将地址添加到人员的地址列表中,Hibernate在连接表中插入一行。
事实上这是部分正确的,因为插入实际上是在提交事务时完成的。但是像JPA这样的ORM的原则是你在实体中指定的映射告诉JPA必须如何以及在何处保持实体及其关联。
答案 1 :(得分:0)
Apache OpenJPA与OpenEJB捆绑在一起作为默认持久性提供程序。有关注释@JoinTable
的详细信息,请参阅manual
如果映射注释中没有错误,一旦加载了OpenJPA,这可能会在数据库中自动生成或修改表。您需要在persistence.xml
下添加下一个属性:
<property name="openjpa.jdbc.SynchronizeMappings"
value="buildSchema(ForeignKeys=true)" />
有关此问题的详细信息,请参阅1.3. Runtime Forward Mapping中的manual部分。