在JPA实体侦听器中排除字段

时间:2012-07-18 07:19:02

标签: java java-ee jpa entitylisteners

我的Enterprise Java应用程序中有一个实体类,它附加了一个实体监听器:

@Entity
@EntityListeners(ChangeListener.class)
public class MyEntity {

   @Id
   private long id;

   private String name;

   private Integer result;

   private Boolean dirty;

   ...
}

但是,我希望它能够为除布尔值之外的所有字段触发实体监听器。有没有办法排除一个字段触发实体监听器而不使其成为瞬态?

我正在使用Java EE 5和Hibernate。

2 个答案:

答案 0 :(得分:3)

但是,如果您实施自己的解决方案,则可能。我对审计日志业务需求有同样的需求,因此设计了我自己的AuditField注释,并应用于要审计记录的字段。

以下是一个实体bean中的示例 - 站点。

@AuditField(exclude={EntityActionType.DELETE})
@Column(name = "site_code", nullable = false)
private String siteCode;

因此,该示例表明'siteCode'是审核日志的字段,DELETE操作除外。 (EntityActionType是一个枚举,它包含CRUD操作。)

此外,EntityListener还有这部分代码。

@PostPersist
public void created(Site pEntity) {
log(pEntity, EntityActionType.CREATE);
}

@PreUpdate
public void updated(Site pEntity) {
log(pEntity, EntityActionType.UPDATE);
}

@PreRemove
public void deleted(Site pEntity) {
log(pEntity, EntityActionType.DELETE);
}

现在,它必须在log()中做什么,以确定审核日志的字段以及可选的自定义操作。

然而,还有另一个需要考虑的问题。 如果将注释放在另一个实体变量上,那么必须记录实体的哪些字段? (即链式伐木)

您是否可以选择仅在实体中使用@AuditField注释的内容或其他方式。对于我的情况,我们决定只记录实体ID,它是数据库表的PK。但是,假设业务可以改变,我想让它变得灵活。因此,所有entites必须实现auditValue()方法,它来自基本实体类,默认实现(可覆盖)是返回其ID。

答案 1 :(得分:2)

这里有一些概念混合。 EntityListeners不会通知属性值的更改 - 不是单个属性,也不是所有属性。

因为它们被称为生命周期回调。它们由以下实体的生命周期事件触发:

  • 坚持(前/后)
  • load(post)
  • 更新(前/后)
  • 删除(前/后)

对于它们中的每一个都有匹配的注释。所以答案是,不可能通过持久属性的类型来限制此功能。