使用JPA加载最新版本的实体

问题描述 投票:0回答:1

我有以下实体:

@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)的情况下始终获得最高版本的策略。

我想到了以下几种方法,但我对其中任何一种都不满意:

  1. 将引用的策略的类型从策略更改为字符串并仅保存policyId,这可以工作,但我仍然需要外键约束,我似乎无法找到使用JPA注释创建它的方法(JPA创建我的数据库架构)。
  2. 保持实体不变,但在加载PolicySearch后丢弃加载的策略以支持最新的实体。这可以在DAO中完成,但如果将来有任何实体将PolicySearch作为成员,这似乎是一个非常糟糕的主意。

任何帮助将不胜感激。我使用EclipseLink。

jpa eclipselink
1个回答
0
投票

我尝试向数据库添加约束,但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;
}

这基本上解决了所有问题,并且还有一些其他好处(比如简单的查询)。

© www.soinside.com 2019 - 2024. All rights reserved.