使用JPA的persist()方法的瞬态异常..怀疑实体的持久性..哪一方坚持?

时间:2012-06-08 07:43:52

标签: hibernate jpa transient persist

我第一次在项目中使用persist()方法。使用JPA我使用Hibernate作为提供者。这个案子非常简单。我有2张桌子

  1. 公司 - Company_id(PK,序列),G_Company_id(也是唯一的)
  2. CP_Doc - Chronicle_id(PK),Company_id(FK以上Company_id))
  3. 现在我为某个特定的公司提供了一些CP_Doc。我已成功创建实体(为createNativeQuery工作,为JPA创建)。我还提到了集合的cascade = CASCADE.ALL。

    为了坚持,我写下面的代码。

    Company company = new Company();
        company.setGCompanyId(7);
        for(/* Get all docs for a particular company having id = 7 */) {
            CP_Doc cpDoc = new CP_Doc();
            cpDoc.setChronicleId(/* some chronicle id from the loop */);    
            cpDoc.setCompany(company);
            entityManager.persist(cpDoc);
        }
    

    表之间的关系是一家公司可以有很多cp_docs。所以CP_Doc表是所有者表。我试过从CP_Doc方面坚持下去。我是否也可以从公司实体方面坚持下去。请帮助专家:)

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您已经在数据库中拥有ID为7的公司,并尝试向该公司添加CPDoc。

在这种情况下,坚持公司是没有意义的,因为它已经存在。创建一家新公司也没有任何意义,因为它已经存在。您应该从数据库加载公司,并将公司附加到新的CPDocs(反之亦然):

Company company = entityManager.find(Company.class, 7);
for(...) {
    CP_Doc cpDoc = new CP_Doc();
    cpDoc.setChronicleId(...);    
    cpDoc.setCompany(company);
    company.getCPDocs().add(cpDoc);
    entityManager.persist(cpDoc);
}