MyEntity 是具有生成 id 的经典 JPA 实体。我想根据 id 自动将一个字段(myStringField)设置为一个值。在本例中,如果 id 为 43,我想将其设置为“foo43”。
由于 id 是由数据库自动生成的,因此在 em.persist(myEntity) 调用之前它为空。但是在持久化之后,它有一个由 Hibernate 分配的 id(在 DB 序列上称为 NEXTVAL)。所以,我虽然声明了一个@PostPersist 方法,如下所示:
package ...;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.PostPersist;
@Entity
public class MyEntity {
@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String myStringField;
@PostPersist
public void postPersist(){
System.out.println("The id = " + id);
this.myStringField = "foo" + id;
}
public String getMyStringField() {
return myStringField;
}
...
}
下面是一些创建和持久化实体的代码:
package ...;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Transactional
@Service
public class MySpringBean {
@PersistenceContext EntityManager em;
public void createMyEntity() {
MyEntity myEntity = new MyEntity();
em.persist(myEntity);
System.out.println(myEntity.getMyStringField());
}
}
它打印以下输出:
The id = 47
foo47
这很好。但是,在数据库中,字段 myStringField 是 null !有人知道为什么吗?
我确实希望实体在 MyEntity.postPersist() 方法期间被标记为脏,并且在事务结束时刷新期间会发生更新。但显然不是。
我使用休眠 v4.2.4
有人知道为什么这个数据库记录有一个空值吗?