如何解决在自动触发的默认侦听器之前触发Hibernate自定义事件侦听器
|| 我做了一个自定义的Hibernate Event监听器,扩展了org.hibernate.event.PreInsertEventListener。 自定义侦听器将覆盖onPreInsert方法并设置\“ Contact \”实体的字段,然后再使用DAO将其保存在数据库中。 问题是,在侦听器为其提供值之前该字段为null,并且默认的休眠事件侦听器在我的自定义侦听器之前自动触发。当他们检查ddl时,他们会看到字段上的非null约束,并在允许我的自定义事件侦听器为其指定值之前抛出null检查异常。 (使用spring AOP代替休眠自定义监听器时会发生同样的问题:默认的休眠监听器在我的Aspect方法之前执行) 因此,可以知道我使用spring session factory来调整休眠侦听器的触发顺序。 谢谢解决方法
我有一个为您创建人实体数据历史的示例。希望能帮助到你。
我必须创建一个帮助程序界面:
public interface DataHistoryAware {
public DataHistory getDataHistory();
public void setDataHistory(DataHistory dataHistory);
}
这是侦听器的实现:
public class DataHistoryListener {
@PrePersist
public void setCreateDataHistory(DataHistoryAware model) {
//set creationDate
DataHistory dataHistory = model.getDataHistory() == null ? new DataHistory() : model.getDataHistory();
dataHistory.setCreationDate(new Date());
model.setDataHistory(dataHistory);
}
@PostUpdate
public void setUpdateDataHistory(DataHistoryAware model) {
DataHistory dataHistory = model.getDataHistory() == null ? new DataHistory() : model.getDataHistory();
dataHistory.setLastModificationDate(new Date());
model.setDataHistory(dataHistory);
}
}
个人实体:
@Entity
@EntityListeners(DataHistoryListener.class)
@Table(name=\"person\")
public class Person implements Serializable,DataHistoryAware {
@Column(name = \"full_name\",length = 255,nullable = false)
private String fullName;
@OneToOne(cascade = CascadeType.PERSIST)
@JoinColumn(name = \"data_history_id\",nullable = false)
private DataHistory dataHistory;
public String getFullName() {
return this.fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public DataHistory getDataHistory() {
return dataHistory;
}
public void setDataHistory(DataHistory dataHistory) {
this.dataHistory = dataHistory;
}
}
此实现在持久之前为人实体创建数据历史记录,并在合并之前对其进行更新。 datahistory属性具有非空约束,因此这与联系人实体的非空属性的问题相同。希望它有用。
, 恕我直言,您正在做的太过分了。您可以使用拦截器实现相同的目的
如果您已经知道这一点,并且出于某些原因(有兴趣)选择覆盖PreInsetEventListener,那么您需要从覆盖org.hibernate.event.def.AbstractSaveEventListener的默认实现开始。
例如,org.hibernate.event.def.DefaultSaveEventListener。
可以在\'AbstractSaveEventListener.performSaveOrReplicate \'中看到可空性和外键约束检查,并将EntityActions添加到操作队列中。这些动作是在会话刷新期间执行的,这是从EntityActions调用PreInsertEventListener的时候。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。