从数据库加载实体时调用@ PrePersist / @ PreUpdate

时间:2014-09-22 08:06:37

标签: java hibernate jpa wildfly

当前设置:Hibernate 4.3.6,Wildfly 8。

我对我的实体关系做了一些迁移,为了确保与以前的数据兼容,我使用实体监听器回调来处理旧字段中的新字段。

@Entity
public class MyEntity{

 @NotNull
 @Deprecated
 private String previousField;

 @OneToOne(cascade=ALL)
 private MyNewFieldType newField;

 @PrePersist
 @PreUpdate
 void movePreviousToNewField() {
  this.newField = movePrevious(this.previousField);
 }
}

@Entity
public class MyOtherEntity{

 @OneToOne(cascade = ALL)
 @NotNull
 private MyEntity myEntity;

}

当我执行以下操作时:

@PersistenceContext
private EntityManager em;

....
//This works fine, the @PreUpdate/@PrePersist is not called on the MyEntity
MyOtherEntity entity = em.findEntity(...);

//This on loading the relations, calls @PreUpdate/@PrePersist??
List<MyOtherEntity> entities = em.findEntities(...);

为了加载列表,我得到一个例外:

object references an unsaved transient instance - save the transient instance before flushing on (MyNewFieldType.id)

我不想保存任何东西,我只是加载列表。

请注意,当我没有@ PreUpdate / @ PrePersist回调,并手动移动,然后更新实体时,一切正常。新实体字段按预期级联持久化。

0 个答案:

没有答案