如何在许多实体中重复播放JPA列定义?

时间:2014-07-24 15:48:26

标签: jpa

我有多个表,其中UPDATE_TIME和INSERT_TIME列必须由应用程序代码管理。有没有办法避免在每个Entity类中重复列定义和行为?具体来说,我想以某种方式考虑列定义和@ PrePersist / @PreUpdate方法。

@Entity
@Table(name="THINGS")
public class Thing {
  // ... other columns ...
  @Column(name = "INSERT_TIME")
  private Date insertTime;

  @Column(name = "UPDATE_TIME")
  private Date updateTime;

  @PrePersist
  protected void onCreate() {
    insertTime = new Date();
  }

  @PreUpdate
  protected void onUpdate() {
    updateTime = new Date();
  }
}

2 个答案:

答案 0 :(得分:2)

使用@MappedSuperclass(cf here):

@MappedSuperclass
public class CommonThing {
  @Column(name = "INSERT_TIME")
  private Date insertTime;

  @Column(name = "UPDATE_TIME")
  private Date updateTime;

  @PrePersist
  protected void onCreate() {
    insertTime = new Date();
  }

  @PreUpdate
  protected void onUpdate() {
    updateTime = new Date();
  }
}

然后:

@Entity
public class Thing extends CommonThing {
    // Other columns.
}

在文档API中,@MappedSuperclass还会处理注释,例如@PrePersist

答案 1 :(得分:1)

我并非100%确定生命周期方法可行,但您可以尝试使用Embeddable s:

@Embeddable
public class Trace {

    @Column(name = "INSERT_TIME")
    private Date insertTime;

    @Column(name = "UPDATE_TIME")
    private Date updateTime;

    @PrePersist
    protected void onCreate() {
        insertTime = new Date();
    }

    @PreUpdate
    protected void onUpdate() {
        updateTime = new Date();
    }
}

@Entity
public class Thing {
    @Embedded
    private Trace trace;
    //more stuff
}

@Entity
public class OtherThing {
    @Embedded
    private Trace trace;
    //other stuff
}

这样你就不需要为你的entites引入一个单独的超类。与使用此table的任何Entity相对应的embeddable需要定义列INSERT_TIMEUPDATE_TIME。如果需要,您可以使用@AttributeOverride覆盖这些列名称。