Загрузить последнюю версию сущности с помощью JPA - PullRequest
0 голосов
/ 06 марта 2019

У меня есть следующие объекты:

@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;
}

По сути, у меня есть страховой полис, в котором все изменения отслеживаются в БД (auditVersion). После небольшого изменения версия может быть выпущена, и тогда версия увеличивается, и audVersion снова начинает 0. У каждой записи БД свой UUID, но страховой идентификатор остается одинаковым для всех версий одного полиса.

Проблема: у меня есть объект для поиска, поиск всегда ищет все версии политики - поэтому я ссылаюсь на policyId, а не на uuid. Когда JPA загружает объект, я получаю любую политику. Я хотел бы получить способ всегда получать наивысшую версию политики с учетом указанного идентификатора policyId (и наивысшего уровня audVersion этой версии).

Я думал о следующих путях, но я не доволен ни одним из них:

  1. Измените тип указанной Политики с Policy на String и сохраните только policyId, это будет работать, но я все еще хотел бы ограничение внешнего ключа, и я не могу найти способ создать его с аннотацией JPA ( JPA создает мою схему БД).
  2. Сохраните сущности как есть, но откажитесь от загруженной Политики в пользу самой новой после загрузки PolicySearch. Это может быть сделано в DAO, но если в будущем какой-либо объект будет иметь PolicySearch в качестве члена, это кажется очень плохой идеей.

Любая помощь будет принята с благодарностью. Я использую EclipseLink.

1 Ответ

0 голосов
/ 13 марта 2019

Я пытался добавить ограничения в БД, но 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;
}

Это в основном решает все проблемы и имеет некоторые другие преимущества (например, простые запросы).

...