MyEntity是一個帶有生成ID的傳統JPA實體。我想自動設置一個字段(myStringField)爲基於id的值。在這個例子中,如果ID是43,我想將它設置爲「foo43」。在@PostPersist中修改的字段在DB中未更新
由於id由數據庫自動生成,所以在em.persist(myEntity)調用之前它爲null。但是在持久化之後,它有一個由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字段爲空!有人知道爲什麼嗎?
我的確希望實體在MyEntity.postPersist()方法期間被標記爲骯髒,並且在刷新期間更新將在事務結束時發生。但實際上不是。
我使用Hibernate V4.2.4
是否有人知道爲什麼這個數據庫記錄有一個空值?