3

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

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

   @Id
   private long id;

   private String name;

   private Integer result;

   private Boolean dirty;

   ...
}

但是,我希望它能够为除布尔值之外的所有字段触发实体侦听器。有什么方法可以排除字段触发实体侦听器而不使其瞬态?

我正在使用带有 Hibernate 的 Java EE 5。

4

2 回答 2

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。但是,假设业务可以改变,我想使其灵活。因此,所有实体都必须实现 auditValue() 方法,该方法来自基实体类,并且默认实现(可覆盖)是返回其 ID。

于 2012-10-22T15:57:33.267 回答
2

这里有某种概念的混合。EntityListener 不会收到有关属性值更改的通知 - 不是针对单个属性,也不是针对所有属性。

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

  • 坚持(前/后)
  • 加载(发布)
  • 更新(前/后)
  • 删除(前/后)

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

于 2012-07-18T07:40:06.937 回答