簡體   English   中英

傑克遜JPA保留外鍵復合ID失敗

[英]Jackson JPA persisting foreign key composite-id fails

我有一個JPA實體,其中外鍵是Composite-id的一部分:

@Entity
@IdClass(CustomerId.class)
public class Customer {

    @Id
    public String id;

    @Id
    @ManyToOne
    public Company company;

}

public class CustomerId  {

    public String id;

    public String company;

}

@Entity
public class Company {

    @Id
    public String id;

    public String name;

}

而且有效。 問題是當我收到要保留的JSON對象,而Jackson將其反序列化為POJO時:

{
    "id": "Cust0001",
    "company": {
        "id": "Comp1"
     }
}

這是JAX-RS資源:

@Path("/customers")
public class CustomerResource {

    @PersistenceContext
    EntityManager em;

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    public void post(Customer customer) {
        em.persist(customer);
    }

}

這失敗了,因為JPA(我使用Hibernate)嘗試將級聯persistid “ Comp1”的Company的非托管實例,從而拋出EntityExistsException

我發現完成這項工作的唯一方法是:

customer.company = em.merge(customer.company);
em.persist(customer);

但是我正在尋找一種通用的解決方案,因為我有數十個類似Customer的實體,而他們的JAX-RS資源擴展了抽象資源,在持久化實體之前我不知道要合並/設置什么。

更新

嘗試將兩個未序列化的對象與對同一實體的引用合並時遇到相同的問題,例如

{
    "id": "Cust0001",
    "company": {
        "id": "Comp1"
     },
     relatedCustomer: {
        "id": "Cust9999",
        "company": {
           "id": "Comp1"
        }
     }
}

合並這也會引發有關Company#Comp1EntityExistsException

在實體類上使用@JsonIdentityInfo進行了解析,這使Jackson可以使用與每個實體的相同實例相關聯的標識符來無冗余地反序列化對象。

Hibernate不支持復雜的查詢..請仔細閱讀hibernate文檔。 請更喜歡

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM