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\npackage ...;\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\npackage ...;\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\nThe 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您正在执行 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
归档时间: |
|
查看次数: |
5682 次 |
最近记录: |