Java Hibernate:仅将manyTone映射到具有特定列值的外键实体
我觉得这有点奇怪,我不确定这是否可能,但我的要求如下:Java Hibernate:仅将manyTone映射到具有特定列值的外键实体,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我觉得这有点奇怪,我不确定这是否可能,但我的要求如下: @Entity @Table(name = "organization") public class Organization { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long id; private String type; private String name; pr
@Entity
@Table(name = "organization")
public class Organization {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String type;
private String name;
private String address;
private String status;
private String subtype;
@Column(name = "created_date")
@Temporal(value = TemporalType.TIMESTAMP)
private Date createdDate;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "organization_id", insertable = false, updatable = false)
private List<User> users;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns({ @JoinColumn(name = "subtype", referencedColumnName = "name", insertable = false, updatable = false),
@JoinColumn(name = "type", referencedColumnName = "organization_type", insertable = false, updatable = false) })
private OrganizationSubType organizationSubType;
// Getters and setters
.
.
.
我有两个实体:数据集
和组织
。数据集
实体具有到组织
实体的多对一映射。组织有两种类型:客户
和合作伙伴
。业务需求是只有合作伙伴
类型的组织才能拥有数据集。那么,有没有办法将数据集
实体映射到组织
,使得数据集
中的所有外键只包含组织
实体的ID,这些实体属于合作伙伴
组织实体的定义如下:
@Entity
@Table(name = "organization")
public class Organization {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String type;
private String name;
private String address;
private String status;
private String subtype;
@Column(name = "created_date")
@Temporal(value = TemporalType.TIMESTAMP)
private Date createdDate;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "organization_id", insertable = false, updatable = false)
private List<User> users;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumns({ @JoinColumn(name = "subtype", referencedColumnName = "name", insertable = false, updatable = false),
@JoinColumn(name = "type", referencedColumnName = "organization_type", insertable = false, updatable = false) })
private OrganizationSubType organizationSubType;
// Getters and setters
.
.
.
那么,有没有办法在映射上设置一个约束,使新的数据集实体被持久化时,组织id始终属于partner而不是customer类型的实体?或者我必须将客户和合作伙伴组织作为单独的实体分开吗?有几种方法可以实现这一点:
Dataset
对象时,在业务层的位置添加验证。这种验证将检查给定的组织
是否可以与基于组织类型创建的数据集
实体相关联
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.4.Final</version>
</dependency>
SQL检查约束
if您使用的数据库支持它-就像中的示例一样
因为合作伙伴和客户的组织结构与方案4中的方法相同。看起来情况太复杂了。我建议您选择选项1。谢谢您提供了可能的解决方案。我已经在考虑在我的服务层中实现一些自定义逻辑。我只是想看看是否可以在Hibernate本身设置一些约束。
@Constraint(validatedBy = PartnerOrganisationValidator.class)
@Target(FIELD)
@Retention(RUNTIME)
@Documented
public @interface PartnerOrganisation {
String message() default "Organisation should be of type PARTNER";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
public class PartnerOrganisationValidator implements ContraintValidator<PartnerOrganisation, Organisation> {
@Override
public boolean isValid(Organisation organisation, ConstraintValidatorContext constraintValidatorContext) {
return organisation == null || "PARTNER".equals(organisation.type);
}
}
@PartnerOrganisation
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="partner_id", referencedColumnName="id", insertable = false, updatable = false)
private Organization partner;