【发布时间】:2011-10-13 06:31:08
【问题描述】:
我有一个与另一个实体 BP 有关系的实体 VM。这种关系是急切的。首先我加载一个虚拟机。加载后,VM 在客户端被分离、序列化和更改。现在我想更新更改的实体,所以我使用 JPA 中的 EntityManager.merge() 方法。现在我从 OpenJPA 遇到以下错误:
“附加期间在持久字段“Vm.bp”中遇到新对象。但是,此字段不允许级联附加。将此字段的级联属性设置为 CascadeType.MERGE 或 CascadeType.ALL(JPA 注释)或“合并”或“全部”(JPA orm.xml)。您不能在没有级联的情况下附加对新对象的引用。”
为什么我必须将 Cascade.MERGE 添加到与另一个永远不会改变的实体的关系中?为什么 JPA 认为 BP 是一个新对象(“...无法附加对新对象的引用...”)? 使用 ManyToOne 关系时,我是否总是必须添加 Cascade.MERGE 才能更新实体,还是因为 EAGER 提取类型?
这是我的实体:
@Entity
@Table(name = "VM")
public class Vm extends BaseEntity implements Serializable {
public static final long serialVersionUID = -8495541781540291902L;
@Id
@SequenceGenerator(name = "SeqVm", sequenceName = "SEQ_VM")
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SeqVm")
@Column(name = "ID")
private Long id;
// lots of other fields and relations
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "BP_ID")
private Bp bp;
// ...
}
【问题讨论】:
标签: jpa merge persistence fetch eager-loading