我有一个与另一个实体BP有关系的实体VM。这种关系引人瞩目。首先我加载一个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;
// ...
}
答案 0 :(得分:0)
我找到了出现此错误消息的原因:相关Bp实体的@Version带注释的数据库字段已初始化为“0”。显然,OpenJPA(1.2.3)无法应对零的实体版本。
将版本设置为1解决了我的问题。