当使用.save()或.update()而不是.saveOrUpdate()时,不会触发自己的Hibernate DefaultSaveOrUpdateEventListener

当使用.save()或.update()而不是.saveOrUpdate()时,不会触发自己的Hibernate DefaultSaveOrUpdateEventListener,hibernate,Hibernate,我试图构建一个spring(3.1)和hibernate(3.6.10)web应用程序,但hibernate事件出现了问题。 我实现了自己的DefaultSaveOrUpdateEventListener,用于更新/创建dateCreated和LastUpdate日期,该日期在每个.saveOrUpdate()事件上调用。到目前为止还不错 在.save()或.update()事件上不也应该调用此侦听器吗? 还是我在这里遗漏了什么 听众: public class SaveOrUpdateDate

我试图构建一个spring(3.1)和hibernate(3.6.10)web应用程序,但hibernate事件出现了问题。 我实现了自己的DefaultSaveOrUpdateEventListener,用于更新/创建dateCreated和LastUpdate日期,该日期在每个.saveOrUpdate()事件上调用。到目前为止还不错

在.save()或.update()事件上不也应该调用此侦听器吗? 还是我在这里遗漏了什么

听众:

public class SaveOrUpdateDateListener extends DefaultSaveOrUpdateEventListener {

    private static final long serialVersionUID = 1L;

    private static Logger log = Logger.getLogger(SaveOrUpdateDateListener.class);


    @Override
    public void onSaveOrUpdate(SaveOrUpdateEvent event) {
        log.debug("Entered onSaveOrUpdate()");

        if (event.getObject() instanceof BaseDomain) {
            BaseDomain record = (BaseDomain) event.getObject();

            record.setDateUpdated(new Date());

            if (record.getDateCreated() == null) {
                record.setDateCreated(new Date());
            }
        }

        super.onSaveOrUpdate(event);
    }
}
休眠配置(部分):

dao方法示例(有效):



编辑

在我决定不使用saveOrUpdate之后,我希望通过使用如下基类解决我的问题:

@MappedSuperclass
public class BaseDomain {

    @Id
    @GeneratedValue
    protected Integer id;

    @Column(nullable=false)
    protected Timestamp dateCreated;

    @Column(updatable = false, insertable = false, columnDefinition = "timestamp default current_timestamp on update current_timestamp")
    @Generated(GenerationTime.ALWAYS)
    protected Timestamp dateUpdated;


    protected BaseDomain() {
        this.dateCreated = new Timestamp(System.currentTimeMillis());
    }

    public Integer getId() {
        return id;
    }

    protected void setId(Integer id) {
        this.id = id;
    }

    public Timestamp getDateCreated() {
        return dateCreated;
    }

    public Date getDateUpdated() {
        return dateUpdated;
    }
}

由于每个表只能使用当前的时间戳一次(mysql限制),我尝试通过构造函数构建dateCreated。

只有调用saveOrUpdate时才会发生Save update事件。保存更新不是保存、更新的某种组合。和saveOrUpdate

按以下方式拼写:

14.2。事件系统

会话接口的所有方法都与事件相关。

当对这些方法之一发出请求时,Hibernate会话 生成适当的事件并将其传递给配置的事件 该类型的侦听器

@Autowired
private SessionFactory sessionFactory;


@Override
public void add(Registration registration) {
    sessionFactory.getCurrentSession().save(registration);
}

@Override
public void update(Registration registration) {
    sessionFactory.getCurrentSession().update(registration);
}
@Autowired
private SessionFactory sessionFactory;


@Override
public void add(Registration registration) {
    sessionFactory.getCurrentSession().saveOrUpdate(registration);
}

@Override
public void update(Registration registration) {
    sessionFactory.getCurrentSession().saveOrUpdate(registration);
}
@MappedSuperclass
public class BaseDomain {

    @Id
    @GeneratedValue
    protected Integer id;

    @Column(nullable=false)
    protected Timestamp dateCreated;

    @Column(updatable = false, insertable = false, columnDefinition = "timestamp default current_timestamp on update current_timestamp")
    @Generated(GenerationTime.ALWAYS)
    protected Timestamp dateUpdated;


    protected BaseDomain() {
        this.dateCreated = new Timestamp(System.currentTimeMillis());
    }

    public Integer getId() {
        return id;
    }

    protected void setId(Integer id) {
        this.id = id;
    }

    public Timestamp getDateCreated() {
        return dateCreated;
    }

    public Date getDateUpdated() {
        return dateUpdated;
    }
}