@OneToMany和@ManyToMany如何在嵌入式类中工作?

时间:2016-09-02 16:54:53

标签: mysql eclipselink jpa-2.0

[我知道问题不应该只包含一个以上的问题,但是......我想知道这条思路在哪里脱轨:]

1)是否可以在嵌入式类中包含@OneToMany@ManyToMany属性? (即直接嵌入,而不是通过@ElementCollection

2)如果是,嵌入式类是否可以为连接表指定@Id字段,而不是作为主机实体的@Id字段?

3)如果否,联接表是否引用主机实体的@Id字段?

4)如果是,是否可以将这样的嵌入式类嵌入到多个主机实体中?

5)如果是,并且如果未指定name的{​​{1}},是否会生成两个连接表,每个主机表一个?

6)如果@JoinTable 的名称是,那么只会生成一个表,否则会产生错误?

7)如果生成了一个表,并且未指定@JoinTable内的joinColumns,是否会为不同的主机实体生成不同的列?

8)如果指定了@JoinTable ,此列是否包含两个主机实体的交替joinColumns值? (可能没有外键,导致不同表的重复@id值出错?)

1 个答案:

答案 0 :(得分:2)

https://en.wikibooks.org/wiki/Java_Persistence/Embeddables#Relationships涵盖了大部分内容 和https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Embeddable#Relationships

  1. JPA 1.0不允许这样做,但JPA 2.0确实如此。
  2. 否。 Embedables 不是实体,所以没有身份。使用的任何参考 通过Embeddable使用父母的id。任何反向引用
  3. 嵌入式对象实例不能共享,但类可以 在其他实体中重复使用。
  4. 规范声明连接表是基于所涉及的两个实体创建的,因此可能会有不同的表。在重复使用嵌入式关系时,您可以使用属性覆盖来指定表格,因为我从未在嵌入式中看到过1:M - 在大多数情况下,它们通常没有背板,因此它们没有多大意义需要实体引用另一个实体。
  5. 假定所有实体     使用embeddable将使用相同的连接表。将有     许多问题,但没有任何验证可能会发现。
  6. DDL生成是不同的。尝试一下,因为你提出的建议可能会出现很多问题。
  7. 不推荐,不会在任何地方说明会发生什么。如果该字段存在,它将起作用。如果使用嵌入的实体没有该字段,则会出现问题。