Слияние Hibernate с другой аудиторской таблицей

У меня есть таблица аудита с ревизией, и я хочу создать другую таблицу с отношением "один ко многим" с ревизией таблицы аудита. Пересмотр ревизии будет указывать на новые данные таблицы. Как я могу это сделать?

Ответ 1

Я сделал что-то похожее в проекте, в котором есть студенческие GPA (таблица аудита с ревизиями), а затем таблица с CurrentGpa, которая всегда указывает на ведущую ревизию из таблицы GPA. Для этого я использовал следующую структуру:

CurrentGpa.java

@Entity(name = HibernateConsts.CURRENT_GPA_TABLE)
public class CurrentGpa {
  protected Gpa gpa;
  protected Student student;
  protected Long id;

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = HibernateConsts.CURRENT_GPA_ID)
  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  @OneToOne(optional = true, fetch= FetchType.EAGER)
  @Fetch(FetchMode.JOIN)
  @JoinColumn(name = HibernateConsts.GPA_FK)
  public Gpa getGpa() {
    return gpa;
  }

  public void setGpa(Gpa gpa) {
    this.gpa = gpa;
  }

  @OneToOne(optional = true, fetch= FetchType.EAGER)
  @Fetch(FetchMode.JOIN)
  @JoinColumn(name = HibernateConsts.STUDENT_FK)
  public Student getStudent() {
    return student;
  }

  public void setStudent(Student student) {
    this.student = student;
  }

  // ...
}

Gpa.java

@Entity(name = HibernateConsts.GPA_TABLE)
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public abstract class Gpa {
  protected Long studentId;
  protected Double score;
  protected LocalDate startDate;
  protected LocalDate endDate;
  protected LocalDate calculationDate;
  protected Long id;

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = HibernateConsts.GPA_ID)
  public Long getId() { return id; }

  public void setId(Long id) {
    this.id = id;
  }

  @Column(name = HibernateConsts.STUDENT_FK)
  public Long getStudentId() {
    return studentId;
  }

  public void setStudentId(Long studentId) {
    this.studentId = studentId;
  }

  @Column(name = HibernateConsts.GPA_SCORE)
  public Double getScore() {
    return score;
  }

  public void setScore(Double score) {
    this.score = score;
  }

  @Column(name = HibernateConsts.GPA_START_DATE)
  public LocalDate getStartDate() {
    return startDate;
  }

  public void setStartDate(LocalDate startDate) {
    this.startDate = startDate;
  }

  @Column(name = HibernateConsts.GPA_END_DATE)
  public LocalDate getEndDate() {
    return endDate;
  }

  // ...
}