是否可以强制 Hibernate 嵌入实体?

Is it possible to force Hibernate to embed an Entity?

在我的用例中,我想 @Embedded 实体中的 class C

另一个实体引用 C@OneToMany 关联,因此 C 被注释为 @Entity

我知道这似乎是个糟糕的设计,但我相信它在我的案例中非常有意义。

是否可以强制 Hibernate 嵌入实体?如果我尝试,Hibernate 会抱怨 C.

的 id 属性 缺少 setter

我认为问题出在这里:

@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;

Hibernate 不允许您将 Embeddable 视为 Entity 或嵌入 Entity。根据 Hibernate types:

  • 一个 Embeddable,没有标识符,因为它的状态是拥有 Entity.
  • 的一部分
  • 无法嵌入Entity,因为每个Entity都有不同的生命周期。

因为另一个 class 已经与 class C 建立了 @OneToMany 关联,很明显你不能将它变成 Embeddable.

更多,一个bidirectional @OneToMany association will perform better than an embeddable collection.

您可以做的是将其用作要嵌入 C 实体的实体中的 @OneToOne 关联。您可以使该目标实体成为关联的拥有方,以便 C 关联绑定到目标实体生命周期。

为什么不直接创建您想要的实体,然后在该实体中嵌入 C。这样你在两个 classes 中都有 C,一个嵌入新实体,另一个嵌入新实体。

@Embeddable
public class Contact {
    private String firstname;
    private String lastname;
    // getters and setters removed.
}

这是你的嵌入 class:

@Entity
public class Student {
    @Embedded
    private Contact contact;    
}

这是嵌入联系人的新实体

@Entity
public class FirmContact {
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO)
    private int contactId;

    @Embedded
    private Contact contact;
}

最后 class 坚持认为联系人必须是一个实体:

@Entity
public class Business {
    @OneToOne(cascade=CascadeType.ALL)
    private FirmContact contacts;
}

填充对象只是 java 中的几个额外步骤,但它应该可以完成您想要的映射。希望对您有所帮助。