Search code examples
hibernateone-to-manyhibernate-envers

Hibernate join table with other audit table


I have an audit table with revisioning and I want to create another table with one-to-many relation with the audit table revision. The audit revision will pointing to the new table data. How can I do that?


Solution

  • I've done something similiar in a project that has student GPAs (audit table with revisions) and then a table with the CurrentGpa which always points to a lead revision from the GPA table. To do this I used the following structure:

    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;
      }
    
      // ...
    }