我的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。
答案 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不会通知属性值的更改 - 不是单个属性,也不是所有属性。
因为它们被称为生命周期回调。它们由以下实体的生命周期事件触发:
对于它们中的每一个都有匹配的注释。所以答案是,不可能通过持久属性的类型来限制此功能。