Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jpa嵌入了与实体的双向关系_Java_Jpa_Orm_Jpa 2.0 - Fatal编程技术网

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的精彩解释,这是一个非常有用的“非所有权关系”示例。