@PostPersist 中修改的字段不会在数据库中更新

Jul*_*tte 6 hibernate jpa

MyEntity 是一个带有生成 id 的经典 JPA 实体。我想根据 id 自动将字段 (myStringField) 设置为值。在此示例中,如果 id 为 43,则我\xe2\x80\x99d 喜欢将其设置为 \xe2\x80\x9cfoo43\xe2\x80\x9d。

\n\n

由于 id 是由数据库自动生成的,因此在 em.persist(myEntity) 调用之前它为 null。但是在持久化之后,它有一个由Hibernate分配的id(在DB序列上调用NEXTVAL)。所以,我想声明一个 @PostPersist 方法,如下所示:

\n\n
package ...;\n\nimport javax.persistence.Entity;\nimport javax.persistence.GeneratedValue;\nimport javax.persistence.GenerationType;\nimport javax.persistence.Id;\nimport javax.persistence.PostPersist;\n\n\n@Entity\npublic class MyEntity {\n\n    @Id   @GeneratedValue(strategy = GenerationType.AUTO)\n    private Long id;\n\n    private String myStringField;\n\n    @PostPersist\n    public void postPersist(){\n        System.out.println("The id = " + id);\n        this.myStringField = "foo" + id;\n    }\n\n    public String getMyStringField() {\n        return myStringField;\n    }\n    ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

下面是一些创建和持久化实体的代码:

\n\n
package ...;\n\nimport javax.persistence.EntityManager;\nimport javax.persistence.PersistenceContext;\n\nimport org.springframework.stereotype.Service;\nimport org.springframework.transaction.annotation.Transactional;\n\n@Transactional\n@Service\npublic class MySpringBean {\n   @PersistenceContext EntityManager em;\n\n   public void createMyEntity() {\n       MyEntity myEntity = new MyEntity();\n       em.persist(myEntity);\n       System.out.println(myEntity.getMyStringField());\n   }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

它打印以下输出:

\n\n
The id = 47\nfoo47\n
Run Code Online (Sandbox Code Playgroud)\n\n

这很好。但是,在数据库中,字段 myStringField 为 null !有人知道为什么吗?

\n\n

我确实期望实体在 MyEntity.postPersist() 方法期间被标记为脏,并且在事务结束时、刷新期间会发生更新。但显然不是。

\n\n

我使用 Hibernate v4.2.4

\n\n

有人知道为什么这个数据库记录有空值吗?

\n

dig*_*oel 0

您正在执行 POST 持久化操作,因此它会在写入数据库之后发生。

根据对JPA @PostPersist 用法的回答,规范指出

These database operations may occur directly after the persist, merge, or remove operations have been invoked or they may occur directly after a flush operation has occurred