我有一个实体Property
,它有几个PropertyAttributes
- 按列表管理,即
@OneToMany(mappedBy = "property", cascade = { CascadeType.ALL}, fetch = FetchType.EAGER)
@JoinFetch(value = JoinFetchType.INNER)
private List<PropertyAttribute> propertyAttribute;
PropertyAttribute
中的我也有Property
的引用,即
@Id
@JsonIgnore
@JoinColumn(name = "property_id")
@ManyToOne
private Property property;
当我保存新的Property
时,例如id=10400
比其他PropertyAttribute
也保存了相同的ID - 正如预期的那样。我的save()
方法如下:
public void save(){
//begin transaction
getEntityManager.persist(newProperty);
// end transaction...
//begin transaction...
getEntityManager.merge(newPropertyAttriubtes);
// end transaction
}
但是当我执行第二轮save()
(现在使用id=10401
时,我得到了奇怪的结果,即:
getEntityManager().find(Property.class,10400)
现在PropertyAttribute
Property
- id
= 10401,即上次保存的记录(=内容错误!)
任何想法为什么它失败了第二次保存?可能是DB问题?还是EclipseLink?
答案 0 :(得分:0)
我终于弄清楚如何正确地做到这一点: - /以防其他人挣扎同样......
public void save(){
//begin transaction
getEntityManager.persist(newProperty);
// end transaction...
newPropertyAttriubtes.forEach(attr -> {
//begin transaction...
getEntityManager.merge(attr);
// end transaction
newProperty.attach(attr)
}
//begin transaction
// to have the PropertyAttributes attached in the EntityManager => merge
getEntityManager.merge(newProperty);
// end transaction...
}
}
让Chris指出正确的方向,以便在JPA管理之后不改变实体!