Hibernate 使用JPA的persist()方法出现暂时异常。。对实体持久性的怀疑。。坚持哪一方?

Hibernate 使用JPA的persist()方法出现暂时异常。。对实体持久性的怀疑。。坚持哪一方?,hibernate,jpa,transient,persist,Hibernate,Jpa,Transient,Persist,我第一次在项目中使用persist()方法。对于JPA,我使用Hibernate作为提供程序。情况很简单。我有两张桌子 Company-Company_id(主键,一个序列),G_Company_id(也将是唯一的) CP_文件-编年史_id(主键),公司id(FK至上述公司id)) 现在我有一些特定公司的CP_文档。我已经成功地创建了实体(为JPA的createNativeQuery、createQuery工作)。我还提到了集合的cascade=cascade.ALL 为了持久化,我编写了以下

我第一次在项目中使用persist()方法。对于JPA,我使用Hibernate作为提供程序。情况很简单。我有两张桌子

  • Company-Company_id(主键,一个序列),G_Company_id(也将是唯一的)
  • CP_文件-编年史_id(主键),公司id(FK至上述公司id))
  • 现在我有一些特定公司的CP_文档。我已经成功地创建了实体(为JPA的createNativeQuery、createQuery工作)。我还提到了集合的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_文档。所以CP_Doc表就是所有者表。我试着从CP_Doc方面坚持。我也可以从公司实体方面坚持。请帮助专家:)

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

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


    您好@Nizet,我在这部分“company.setGCompanyId(7);”中更正了一个小错误。可能有两种情况—1)G_company_ID已经存在(就像本例中的7存在一样)。这是“company.getCPDocs().add(cpDoc);”部分,是否需要?我假设这会隐式发生,因为我们在代码“cpDoc.setCompany(company);”中向cpDoc添加company,2)当G_company_id不在db中时-这里我们必须像我问题中的代码那样创建一个新的company()吗?(查找()失败后)1。这不是绝对必要的,但是如果您想要一个一致的对象图,您必须自己维护它。例如,如果您在同一个会话中继续使用该公司,并且希望在其集合中找到新的CPDoc,那么它就不会在那里了。只有在新会话中从数据库重新加载公司时,它才会出现。2.是的,如果该公司不存在,您需要创建并保留它。+1用于回答中的明确解释以及注释:)
    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);
    }