Krz*_*iek 8 hibernate jpa jpa-2.1
我的实体:
@Entity
public class Document {
@Id
protected String id; //It string in purpose
@OneToOne(cascade = ALL)
@JoinColumn(name = "DOCUMENT_DETAILS")
private DocumentDetails details;
}
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "documentDiscr")
@EqualsAndHashCode
public abstract class DocumentDetails {
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
private Money total;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "SELLER_ID")
private Company seller;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "BUYER_ID")
private Company buyer;
}
@Entity
public class Company {
@Id
protected String id;
private String name;
private String phoneNumber;
private String email;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "address_id")
private Address address;
}
@Entity
@EqualsAndHashCode
public class Address {
@Id
@GeneratedValue(strategy= GenerationType.SEQUENCE)
private Long id;
private String country;
private String city;
private String postalCode;
private String streetName;
private String streetNumber;
private String apartmentNumber;
}
@Path("path")
@Transactional
public class MyResource {
@Inject
MyRepo myRepo;
@PUT
public Document updateDoc(Document document){
myRepo.update(document);
}
}
public class Repo<T extends MyClass> implements MyRepo<T> {
@PersistenceContext
protected EntityManager entityManager;
public T create(T t) {
t.generateId();
this.entityManager.persist(t);
return t;
}
public T update(T entity) {
return entityManager.merge(entity);
}
}
Run Code Online (Sandbox Code Playgroud)
当我调用 entityManage.update(documentEntity) 并且将同一公司添加为供应商和买方时,我看到了
'Multiple representations of the same entity'。
我读了这个,但没有任何帮助。当我删除 CascadeType.All 我得到
'detached entity passed to persist: my.pckg.Address'
我也尝试删除 CascadeType.Merge 但错误是一样的。我可以做什么?我的错误在哪里?
更新
首先,我改变了@ManyToOne(Cascade.All)对@ManyToOne()中DocumentDetails
其次,我改变了@ManyToOne(Cascade.All)对@ManyToOne(Cascade.Merge)在DocumentDetails。
第三II改变@ManyToOne(Cascade.All)到@ManyToOne(all types except all and merge)在DocumentDetails。
我也试过同样的Address课
好的 - 根据 Piotr Gwiazda 的提示我解决了它。
简单而幼稚的解决方案是添加:
if(seller != null && buyer != null){
if(seller.equals(buyer)){
document.getDetails.setSeller(document.getDetails().getBuyer());
}
}
Run Code Online (Sandbox Code Playgroud)
(更好的答案是SpringData)
前update()。这种情况之所以存在,是因为当两个不同的对象相等但它们的引用不同时,hibernate 无法将它们作为同一对象处理。
| 归档时间: |
|
| 查看次数: |
12297 次 |
| 最近记录: |