hibernate/JPA 中的 @PreUpdate 和 @Prepersist(使用会话)

Posted

技术标签:

【中文标题】hibernate/JPA 中的 @PreUpdate 和 @Prepersist(使用会话)【英文标题】:@PreUpdate and @Prepersist in hibernate/JPA (using session) 【发布时间】:2011-05-07 04:56:12 【问题描述】:

我遇到了一个向现有项目添加修复程序的阻止程序。主要问题是我想在POJO 中使用@Prepersist@PreUpdate 来处理LastModified 字段(插入和更新)使用带有会话的 JPA 的休眠实现。

原因?: 之所以需要更改,是因为需要使用liquibase 1.9.5,而且我知道(因为我之前遇到过这种情况)liquibase 使用默认的 current_timestamp 将时间戳转换为日期时间,这对于 mysql 数据库来说太糟糕了。

所以我需要一种方法在代码中而不是在数据库中进行设置,这样我就可以安全地将时间戳字段更改为 datetime。然后 liquibase 很高兴,我很高兴。

现在似乎那些解释器没有被执行,几乎没有搜索我发现它适合使用entityManager。目前没有问题。所以我想知道是否有一个 SIMPLE 解决我的问题,这意味着有@Prepersist@PreUpdate 甚至其他解决方法来设置lastModified 字段仍在使用会话

【问题讨论】:

【参考方案1】:

现在看来那些解释器没有被执行,几乎没有搜索我发现它适合使用 entityManager。

是的,如果您使用 Session API,JPA 回调将不起作用。

所以我想知道是否有解决我的问题的简单方法,这意味着使用 @PrePersist 或 @PreUpdate 甚至其他解决方法来设置仍然使用会话的 lastModified 字段

据我所知,没有简单的方法(如果您使用的是 Spring,也许可以查看 this post)。

我对基于 Hibernate 的解决方案的建议是使用 events(以及一个或多个接口)。以Hibernate and last modified date 为例。

【讨论】:

嗨 Pascal,我尝试过使用休眠事件侦听器,它成功了。再次感谢您的帮助。 ;) 在http://anshuiitk.blogspot.sk/2010/11/hibernate-pre-database-opertaion-event.html有听众很好的解释 这是启用必要事件侦听器的简单方法:n1njahacks.wordpress.com/2016/10/07/…【参考方案2】:

主要是@PrePersist 和@PreUpdate 注解用在hibernate 或jpa 中的entity 中。当我们保存一个实体时,@PrePersist 方法被调用。

【讨论】:

以上是关于hibernate/JPA 中的 @PreUpdate 和 @Prepersist(使用会话)的主要内容,如果未能解决你的问题,请参考以下文章

JPA / Hibernate中@GeneratedValue中的字段生成器有啥用?

hibernate/JPA 中的 @PreUpdate 和 @Prepersist(使用会话)

Hibernate/JPA 注释中的多列连接

Hibernate JPA H2 问题中的“限制”列

Hibernate/JPA @OneToOne 返回空指针异常

如何使用 @ID 和 @GeneratedValue 从 Hibernate + JPA 中的序列中获取 Oracle 生成的值