是否可以强制 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 中的几个额外步骤,但它应该可以完成您想要的映射。希望对您有所帮助。
在我的用例中,我想 @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 中的几个额外步骤,但它应该可以完成您想要的映射。希望对您有所帮助。