gpt4 book ai didi

hibernate - JPA/Hibernate 同一实体的多种表示

转载 作者:行者123 更新时间:2023-12-03 09:29:34 24 4
gpt4 key购买 nike

我的实体:

@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 我得到
'detached entity passed to persist: my.pckg.Address'
我也尝试删除 CascadeType.Merge 但错误是一样的。
我可以做什么?我的错误在哪里?

更新

首先我改了 @ManyToOne(Cascade.All)@ManyToOne()DocumentDetails
第二我改了 @ManyToOne(Cascade.All)@ManyToOne(Cascade.Merge)DocumentDetails .

第三我改了 @ManyToOne(Cascade.All)@ManyToOne(all types except all and merge)DocumentDetails .

我也尝试过 Address类(class)

最佳答案

好的 - 在 Piotr Gwiazda 的提示下,我解决了它。

简单而天真的解决方案是添加:

if(seller != null && buyer != null){
if(seller.equals(buyer)){
document.getDetails.setSeller(document.getDetails().getBuyer());
}
}

(更好的答案是 SpringData)

之前 update() .这种情况是存在的,因为当两个不同的对象相等但它们的引用不同时, hibernate 无法将它们作为同一个对象处理。

关于hibernate - JPA/Hibernate 同一实体的多种表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41899628/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com