【发布时间】:2017-06-13 11:15:11
【问题描述】:
我的实体:
@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);
}
}
当我调用 entityManage.update(documentEntity) 并将同一公司添加为供应商和买家时,我看到
'Multiple representations of the same entity'。
我阅读了this,但没有任何帮助。当我删除 CascadeType.All 我得到 p>
'detached entity passed to persist: my.pckg.Address'
我也尝试删除 CascadeType.Merge 但错误是一样的。 我可以做什么?我的错误在哪里?
更新
首先我在DocumentDetails 中将@ManyToOne(Cascade.All) 更改为@ManyToOne()
其次我在DocumentDetails 中将@ManyToOne(Cascade.All) 更改为@ManyToOne(Cascade.Merge)。
第三次我将DocumentDetails中的@ManyToOne(Cascade.All)更改为@ManyToOne(all types except all and merge)。
我也尝试过 Address 类
【问题讨论】:
-
你能添加持久化实体的事务方法吗?
-
您还从哪些映射中删除了级联?
-
当您说添加同一个公司作为供应商和买家时,您的意思是值相同,还是实际上是同一个对象?
-
@MaciejKowalski 我更新了帖子:)
-
“可能相同的值但不是对象。” - 这是根本原因。我不希望休眠只会保存从 JSON 反序列化的任何内容。这里需要一些手动工作来从数据库获取实际数据并拥有托管实体。例如,您将无法保留映射到现有公司的新文档。级联持久性将在公司实体上失败。尝试使用 Spring Data REST 为您完成。