Java jpa嵌入了与实体的双向关系
嵌入对象和实体之间可能存在双向关系,还是只存在单向关系Java jpa嵌入了与实体的双向关系,java,jpa,orm,jpa-2.0,Java,Jpa,Orm,Jpa 2.0,嵌入对象和实体之间可能存在双向关系,还是只存在单向关系 @Entity public class Employee { @Id private long id; ... @Embedded private EmploymentPeriod period; ... } @Embeddable public class EmploymentPeriod { @Column(name="START_DATE") private java.sql.Date startD
@Entity
public class Employee {
@Id
private long id;
...
@Embedded
private EmploymentPeriod period;
...
}
@Embeddable
public class EmploymentPeriod {
@Column(name="START_DATE")
private java.sql.Date startDate;
@Column(name="END_DATE")
private java.sql.Date endDate;
@OneToMany
private EntityABCD entityABCD ;
....
}
@Entity
public class EntityABCD {
@Id
private long id;
...
@ManyToOne(mappedby="entityABCD")
private EmploymentPeriod period;
...
}
根据JPA规范:2.5可嵌入类
An entity cannot have a unidirectional relationship to the embeddable class of another entity (or itself).
请按照JPA规范的规定澄清上述内容。这确实很难解释,但我会试一试。这是说明书上说的 可嵌入类可能包含与实体或实体集合的关系。自从 可嵌入类本身没有持久标识,引用实体的关系是 指向包含可嵌入实例的实体,而不是指向可嵌入实例本身。[17] 用作嵌入式id或映射键的可嵌入类不得包含此类关系。 [17] 实体不能与另一实体(或自身)的可嵌入类具有单向关系 情况是 Entity1有一个Embedded属性,而Embedded本身也有一个指向entity2的属性 请注意,这是一个复杂的嵌入式对象,因为它是“共享的” 在两个实体之间。即使规范中说嵌入式不应该 如果是共享的,它可能只是具有未定义的语义 规范所讨论的部分是在可嵌入文件中发生的事情,在这种情况下,可嵌入文件中有一个指向实体的引用。如果你考虑一下,需要有一个双向关系,因为一个可嵌入的没有主键,所以它需要某种方式来指向它所引用的实体(外键),例如@OneToOne,而且由于可嵌入的不能是所有者,所以它不能创建外键,即可嵌入的正在引用的实体(Entity2)必须将外键分配给它,唯一的方法是在其自身中有一个标记为@embedded的引用,因此您具有双向关系 下面是一些代码
@Entity
public class Entity1 {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Embedded
private Embeddable embeddable;
//getter/setter
}
@Embeddable
public class Embeddable {
@OneToOne
private Entity2 entity2;
public Entity2 getEntity2() {
return entity2;
}
public void setEntity2(Entity2 entity2) {
this.entity2 = entity2;
}
}
@Entity
public class Entity2 {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
@Embedded
private Embeddable embeddable;
//getter/setter
}
当每个实体指向另一个实体时,关系是双向的。
如果只有一个实体指向另一个实体,则关系是单向的 在你的特殊情况下,这句话: 实体不能与实体具有单向关系 另一个实体(或自身)的可嵌入类 可翻译为: EntityABCD实体不能与实体具有单向关系 另一员工实体的可嵌入类EmploymentPeriod 换句话说: 如果员工实体具有嵌入的EmploymentPeriod,则它不是 可以从EntityABCD定义单向关系 实体到可嵌入雇员的期间 为什么? 因为可嵌入对象没有自己的标识(缺少主键),所以它只需要作为封装它的实体的一部分来处理。 从数据库的角度来看,嵌入式对象与其余实体属性一起存储在一行中 由于上述原因,如果有人试图从
实体ABCD
雇佣期创建单向关系
由于缺少雇佣期的标识,这是不可能的,
因此,不可能在嵌入对象中创建外键
如何克服外键的问题
外键需要在可嵌入类外部物理创建,它取决于关系的类型
@实体
公营雇员{
@身份证
私人长id;
@嵌入
私人雇佣期;
}
@可嵌入
公共类就业期{
@多人//拥有关系
@员工表中的JoinColumn//FK(默认情况下:ENTITYABCD\U ID)
私人实体xiao实体xiao;
@许多人/拥有关系
@MapKey(name=“id”)//引用EntityABCD.id
@联接表中的联接表//FK(默认情况下:EMPLOYEE\u ENTITYABCD)
私有地图实体;
}
@实体
公共类实体{
@身份证
私人长id;
@OneToMany(mappedBy=“period.entityABCD”)//非所有权关系
列出员工名单;
@ManyToMany(mappedBy=“period.entitiesABCD”)//非所有权关系
私人名单雇员;
}
当嵌入对象中存在双向关系时,它们将被视为存在于所属实体中(Employee
)
目标实体(EntityABCD
)指向所属实体,而不是嵌入对象(EmploymentPeriod
)
值得一提的是,Embeddebles只能嵌入:
- 其他可嵌入
- 与实体的关系
- 基本/可嵌入类型的元素集合
感谢Wypiperz的精彩解释,这是一个非常有用的“非所有权关系”示例。