我有以下实体:
@Entity
public class Policy {
@ID
private String uuid;
private String policyId;
private Long version;
private Long auditVersion;
}
@Entity
public class PolicySearch {
@ID
private String uuid;
@ManyToOne(optional = false)
@JoinColumn(name = "policy_id", referencedColumnName = "policy_id")
private Policy policy;
}
基本上,我有一个保险单,其中所有更改都在DB(auditVersion)中进行跟踪。经过一些较小的更改后,可以发布一个版本,即版本递增时,auditVersion再次从0开始。每个数据库条目都有不同的UUID,但对于一个策略的所有版本,insuranceId保持不变。
问题:我有一个搜索实体,搜索总是搜索所有版本的策略 - 这就是我引用policyId而不是uuid的原因。当JPA加载实体时,我最终会使用任何策略。我希望有一种方法可以在给定引用的policyId(以及该版本的最高auditVersion)的情况下始终获得最高版本的策略。
我想到了以下几种方法,但我对其中任何一种都不满意:
任何帮助将不胜感激。我使用EclipseLink。
我尝试向数据库添加约束,但Postgres不允许您为不唯一的列添加外键约束。我们的解决方案(我的同事为我们提出)是改变数据库设计并创建一个持有PolicyId的新实体。所以我们的实体现在看起来像这样:
@Entity
public class Policy {
@ID
private String policyId;
}
@Entity
public class PolicyVersion {
@ID
private String uuid;
private Policy policy;
private Long version;
private Long auditVersion;
}
@Entity
public class PolicySearch {
@ID
private String uuid;
@ManyToOne(optional = false)
@JoinColumn(name = "policy_id", referencedColumnName = "policy_id")
private Policy policy;
}
这基本上解决了所有问题,并且还有一些其他好处(比如简单的查询)。