当前设置: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回调,并手动移动,然后更新实体时,一切正常。新实体字段按预期级联持久化。