Jackson JPA持久的外键复合id失败了

时间:2016-02-23 21:31:18

标签: java json hibernate jpa jackson

我有一个JPA实体,外键是复合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)尝试将persist级联到Company的{​​{1}}“Comp1”的非托管实例,从而抛出id

我发现这项工作的唯一方法是:

EntityExistsException

但我正在寻找一个通用的解决方案,因为我有许多实体,如customer.company = em.merge(customer.company); em.persist(customer); ,他们的JAX-RS资源扩展了一个抽象资源,我不知道在持久化实体之前要合并/设置什么。

更新

尝试将两个未序列化的对象与对同一实体的引用合并时的相同问题,例如

Customer

合并此内容也会引发{ "id": "Cust0001", "company": { "id": "Comp1" }, relatedCustomer: { "id": "Cust9999", "company": { "id": "Comp1" } } } EntityExistsException

2 个答案:

答案 0 :(得分:0)

在实体类上使用@JsonIdentityInfo解析,这使得Jackson使用与每个实体的相同实例关联的标识符来删除没有冗余的对象。

答案 1 :(得分:-2)

Hibernate不支持复杂查询..请查看hibernate文档。 请更喜欢hql