Java JPA/Hibernate预更新不';更新父对象
在我的应用程序中,我定义了以下类:Java JPA/Hibernate预更新不';更新父对象,java,hibernate,jpa-2.0,Java,Hibernate,Jpa 2.0,在我的应用程序中,我定义了以下类: @Entity @Table(name = "forums") public class Forum { @Id @GeneratedValue(generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "uuid") private String id; private String name; private
@Entity
@Table(name = "forums")
public class Forum {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
private String id;
private String name;
private Date lastActivity;
@OneToMany(mappedBy = "forum", cascade = { CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE })
private List<Post> posts;
若我尝试向论坛实体添加新帖子,lastActivity
字段在数据库中被@PrePersist
回调正确更新。
但如果我尝试使用以下代码更新post实体:
entityManager.getTransaction().begin();
Post post = entityManager.find(Post.class, "postId");
post.setContent("New post text");
entityManager.merge(post);
entityManager.getTransaction().commit();
仅更新post数据,且lastActivity
字段值不变。在我看来,@PreUpdate
方法应该做到这一点,并更新论坛实体。
这是一个bug还是我遗漏了什么?这不是bug,即使是快速尝试,这对我来说也是你所期望的。负面消息是,由于以下原因,它不能保证工作: JPA 2.0规范第93页: 通常,便携式应用程序的生命周期方法不应 调用EntityManager或查询操作,访问其他实体 实例,或修改同一持久性中的关系 上下文。[43]生命周期回调方法可能会修改 对其调用的实体的非关系状态 第95页: 回调方法是否正确取决于实现 在生命周期事件级联到之前或之后调用 相关实体。应用程序不应依赖于此顺序
post.merge()
在这里没有用处<代码>发布已明确附加到会话
确保已将
content
属性映射到列,否则Hibernate无法判断实体是否脏,因此无法刷新对DB的更改。在这种情况下,确实不需要post.merge()
。执行上述代码会更改post.content字段的DB值。我的问题是post.forum.lastActivity字段没有更新。这对我来说不是个好消息,但我非常感谢您的帮助。您知道解决这个问题的方法吗?或者您可以告诉我您使用了什么实现来测试我的代码?提前感谢您的回复。Hibernate 3.6.2,HSQL。不是在服务器中,而是作为JavaSE,资源本地事务。我强烈建议不要像@MikkoMaunu建议的那样依赖于此@PreUpdate
在使用Hibernate 4.1.5更新一对多子实体中的字段时对我不起作用。
entityManager.getTransaction().begin();
Post post = entityManager.find(Post.class, "postId");
post.setContent("New post text");
entityManager.merge(post);
entityManager.getTransaction().commit();