@OneToOne 关系与附加约束
@OneToOne relationship with additional constraint
假设,我们有两个实体,第一个:
@Entity
@Table(name = "entitya")
public class EntityA {
@Id
@Column(name = "id")
private Long id;
@Column(name = "name")
private Long name;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
private Set<EntityB> childEntities;
}
第二个:
@Entity
@Table(name = "entityb")
public class EntityB {
@Id
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@Column(name = "master")
private Boolean master;
@ManyToOne
@JoinColumn(name = "parent")
private EntityA parent;
}
到目前为止,还不错。然而,底层数据库表和约束强制要求对于任何 entityA
只能有一个 EntityB
布尔字段 master
设置为 true。我可以通过向 entityA 添加以下方法来提取它:
public entityB getMasterChild() {
for(entityB ent : childEntities) {
if(ent.isMaster()) {
return ent;
}
}
}
问题是,我可以在 EntityA
中创建可以表达该规则的 @OneToOne
关系,以便 entityA
可以有额外的 masterChild
类型 entityB 成员吗?
如果我对你的理解是正确的,你想 create/define 两个实体之间的关系基于某个实体的 属性 的值。想法是实体之间的关系是根据实体计数(有多少实体可以拥有另一个实体)定义的,而不是根据某个实体的 属性 值定义的。
不过
如果您真的想为 masterChild
使用 @OneToOne
映射,我建议为它创建一个单独的 table/entity。完成后,您可以将这个新的 MasterChild
实体包含到 EntityA
中并用 @OneToOne
.
对其进行注释
这是新的 MasterChild 实体
@Entity
public class MasterChild extends EntityB{
@Id
@Column(name = "id")
private Long id;
}
请注意,我已将 'master' 从 EntityB 中删除,因为不再需要它
@Entity
@Table(name = "entityb")
public class EntityB {
@Id
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@ManyToOne
@JoinColumn(name = "parent")
private EntityA parent;
}
这里修改了EntityA
@Entity
@Table(name = "entitya")
public class EntityA {
@Id
@Column(name = "id")
private Long id;
@Column(name = "name")
private Long name;
@OneToOne
private MasterChild master;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
private Set<EntityB> childEntities;
}
假设,我们有两个实体,第一个:
@Entity
@Table(name = "entitya")
public class EntityA {
@Id
@Column(name = "id")
private Long id;
@Column(name = "name")
private Long name;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
private Set<EntityB> childEntities;
}
第二个:
@Entity
@Table(name = "entityb")
public class EntityB {
@Id
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@Column(name = "master")
private Boolean master;
@ManyToOne
@JoinColumn(name = "parent")
private EntityA parent;
}
到目前为止,还不错。然而,底层数据库表和约束强制要求对于任何 entityA
只能有一个 EntityB
布尔字段 master
设置为 true。我可以通过向 entityA 添加以下方法来提取它:
public entityB getMasterChild() {
for(entityB ent : childEntities) {
if(ent.isMaster()) {
return ent;
}
}
}
问题是,我可以在 EntityA
中创建可以表达该规则的 @OneToOne
关系,以便 entityA
可以有额外的 masterChild
类型 entityB 成员吗?
如果我对你的理解是正确的,你想 create/define 两个实体之间的关系基于某个实体的 属性 的值。想法是实体之间的关系是根据实体计数(有多少实体可以拥有另一个实体)定义的,而不是根据某个实体的 属性 值定义的。
不过
如果您真的想为 masterChild
使用 @OneToOne
映射,我建议为它创建一个单独的 table/entity。完成后,您可以将这个新的 MasterChild
实体包含到 EntityA
中并用 @OneToOne
.
这是新的 MasterChild 实体
@Entity
public class MasterChild extends EntityB{
@Id
@Column(name = "id")
private Long id;
}
请注意,我已将 'master' 从 EntityB 中删除,因为不再需要它
@Entity
@Table(name = "entityb")
public class EntityB {
@Id
@Column(name = "id")
private Long id;
@Column(name = "name")
private String name;
@ManyToOne
@JoinColumn(name = "parent")
private EntityA parent;
}
这里修改了EntityA
@Entity
@Table(name = "entitya")
public class EntityA {
@Id
@Column(name = "id")
private Long id;
@Column(name = "name")
private Long name;
@OneToOne
private MasterChild master;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY)
private Set<EntityB> childEntities;
}