我有一个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
。
答案 0 :(得分:0)
在实体类上使用@JsonIdentityInfo
解析,这使得Jackson使用与每个实体的相同实例关联的标识符来删除没有冗余的对象。
答案 1 :(得分:-2)
Hibernate不支持复杂查询..请查看hibernate文档。 请更喜欢hql