小编典典

在自动触发的默认监听器之前触发Hibernate自定义事件监听器

hibernate

我做了一个自定义的Hibernate
Event监听器,扩展了org.hibernate.event.PreInsertEventListener。自定义侦听器会覆盖onPreInsert方法并设置“联系人”实体的字段,然后再使用DAO将其保存在数据库中。

问题是,在侦听器为其提供值之前该字段为null,并且默认的hibernate事件侦听器在我的自定义侦听器之前自动触发。当他们检查ddl时,他们会看到字段上的非null约束,并在允许我的自定义事件侦听器为字段提供值之前抛出null检查异常。(使用spring
AOP代替hibernate自定义监听器时会发生同样的问题:默认的hibernate监听器在我的Aspect方法之前执行)

因此,可以知道我使用spring session factory来调整hibernate侦听器的触发顺序。

谢谢


阅读 461

收藏
2020-06-20

共1个答案

小编典典

我有一个为您创建人实体数据历史的示例。希望能帮助到你。

我必须建立一个 辅助界面

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属性具有非空约束,因此这与联系人实体的非空属性的问题相同。希望它有用。

2020-06-20