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

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

Krz*_*iek 4

好的 - 根据 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 无法将它们作为同一对象处理。