在自动触发的默认侦听器之前触发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的时候。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...