Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA/Hibernate预更新不';更新父对象_Java_Hibernate_Jpa 2.0 - Fatal编程技术网

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();