2009-12-09 75 views
7

我在StackOverflow上遇到了一些类似的问题,尝试了解决方案,但没有找到答案。EclipseLink JPA`@ PreUpdate`调用不存在

我正在使用相当常见的JPA策略来设置一些实体的最后修改时间。设置列和字段,然后标记一个方法​​,并让它设置为等于当前时间。

问题是我可以在调试器中看到该方法正在被调用,并且该字段正在更新,但是在我的数据库日志中,我只看到一个SQL调用来更新不包含UPDATE的更改字段为时间戳字段。

使事情变得更复杂@PrePersist完美地工作,只有​​表现出这种行为。

到目前为止我找到的最接近的解释是在这LINK

在类似的问题:#1725699和#1745890

我使用的EclipseLink v2和JPA V1与GlassFish v2中的兼容性。

我试图直接在实体类的方法中使用这两个注释以及使用@EntityListener注释附加到实体类的EntityListener

我怀疑这是EclipseLink中的一个错误,但我无法证明它。

错误与否我会非常喜欢这个简单的操作工作。这个实现有什么问题吗?这是EclipseLink中的一个已知问题吗?这是JPA中的一个已知问题吗?有没有解决的办法?

缺少去数据库和使用触发器,是否有一个备用路径让我的Java代码设置updated_on时间戳?

感谢您的建议!

代码片段如下。

实体领域:

@Column(name = "updated_on") 
@Temporal(TemporalType.TIMESTAMP) 
private Date updatedOn; 
@Column(name = "created_on") 
@Temporal(TemporalType.TIMESTAMP) 
private Date createdOn; 

注释更新方法:

@PreUpdate 
public void setUpdatedOn(Timestamped object) { 
    object.setUpdatedOn(new Date()); 
} 

@PrePersist 
public void setCreatedOn(Timestamped object) { 
    if (object.getCreatedOn()==null) { 
     object.setCreatedOn(new Date()); 
    } 
} 

回答

4

您所提供的链接精确地描述了您的情况:在肮脏的检查,被称为@PreUpdate方法之前检测到更新的字段并且不再检测@PreUpdate方法中的更改。这可能是出于性能原因而完成的,因为在大型对象图上脏检查可能非常昂贵。现在看来,您的选择是使用特定于提供者的机制(DescriptorEvent)或切换到Hibernate。

+0

菲利克斯定义

<property name="eclipselink.temporal.mutable" value="true" /> 

- 谢谢你的澄清。我认为那是我所看到的。 我看到如何实现DescriptorEvent处理,几乎与注释一些方法一样简单。只需找到正确的XML文件来添加处理程序。 再次感谢! – Freiheit 2009-12-10 15:04:18

+0

嗨Freiheit,我现在面临同样的问题,你会介意分享你的DescriptorEvent代码作为例子吗? :)谢谢 – sunnycmf 2011-04-04 10:20:31

+0

@Freiheit也很想看到解决方案。提前致谢。 – 2011-04-06 12:45:45

3

Mybe有点晚,但对于信息的完整性,这是不是一个错误,但记录的行为:

日期或日历类型假定是在默认情况下可变的,如果需要要调用日期或日历上的设置方法,那么必须将映射设置为@Mutable。

对于日期和日历类型,全局持久性属性“eclipselink.temporal.mutable”也可以设置为“true”。

所以,无论是标注

@Mutable 
@Column(name = "updated_on") 
@Temporal(TemporalType.TIMESTAMP) 
private Date updatedOn; 

或在persistence.xml中

+0

非常感谢Michele,它和我一起工作就像一个魅力。 – 2016-10-22 21:37:07

+0

不客气:) – 2016-10-23 09:22:09

+0

我已经添加了这个注释,但它仍然无法正常工作([请参阅我的问题](https://stackoverflow.com/questions/47081932/prepersist-not-working-with-mappedsuperclass-in-hibernate -Spring环境))。任何想法为什么? – displayname 2017-11-02 18:30:40