0

我有两个域类。下面是课程的粗略草图。

公司.java

public class Company{

    @OneToMany(orphanRemoval="true",cascade=CascadeType.ALL,
    mappedBy="company")
    private List<Department> departments;

}

部门.java

public class Department{

   @ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.PERSIST)
   @JoinColumn(name="company_id")
   private Company company

}

JPA @ManyToOne with CascadeType.ALL说 CascadeType.ALL 的含义是持久性将传播(级联)所有 EntityManager 操作(PERSIST, REMOVE, REFRESH, MERGE, DETACH)到相关实体。

Test.java的main方法

//session started and transaction begin
Company company=new Company();
company.setName("Company");

Department department=new Department();
department.setName("Testing department");

department.setCompany(company);

session.save(department);

//transaction committed and session closed

它给了我的例外

Exception in thread "main" org.hibernate.PropertyValueException: not-null property references a null or transient value: someValue

但是当我CascadeType.ALL在 @ManyToOne 注释上使用时,它可以正常工作,但不能使用CascadeType.PERSIST 所以我应该使用什么来使这个示例工作而不使用CascadeType.ALLas ALL uses (PERSIST, REMOVE, REFRESH, MERGE, DETACH)。那么我应该使用以下哪一项来完成我的工作而不是 ALL 以及它们是如何工作的?

4

2 回答 2

1

您已将 CascadeType 设置为PERSISTin Departmententity,因此您必须使用session.persist(Object)method 而不是save.

所以使用这个:

session.persist(department);

更新:

Company实体已将 CascadeType 设置为ALLon Department。同样在一对多关系中Department,作为关联所有者的多方。

因此,如果您保存而Company不是适用。由于公司不是协会的所有者,您必须将部门添加到您的部门以保持双向关系。代码看起来像这样。DepartmentCascadeType.ALLCompany

    List<Department> departments = new ArrayList<Department>();
    departments.add(department);
    company.setDepartments(departments);

    session.persist(company); // or you can also use save here.

如果您不维护关系,则Department不会保存在数据库中。

于 2014-10-01T12:37:35.377 回答
1

您似乎将 JPA 注释与 Hibernate 会话接口混合在一起。

如果你使用的是 Hibernate Session 接口,你应该使用 Hibernate 注释。那是:

  @Cascade(CascadeType.SAVE_OR_UPDATE)
  private Company company

如果您选择使用 JPA 注释,您应该使用 EntityManager 接口并调用

  entityManager.persist(departement);

而不是 session.save()。

我的建议是坚持使用 JPA 界面并使用 EntityManager。

更新:

我认为真正的问题是您试图以一对多的关系保留(或保存)一个未附加的实体,即部门,该实体与另一个未附加的实体公司相关。当它发生时,Hibernate 必须通过合并(附加)公司实体来检查公司是否已经存在于数据库中。因此,如果您想在数据库中为部门插入一条新记录,为公司插入另一条记录,您必须选择:

  • 在保存部门之前调用persist(company),以便公司实体已经合并,Hibernate不需要合并它。

或将 CascadeType.MERGE 添加到公司

@ManyToOne(cascade={ CascadeType.MERGE, CascadeType.PERSIST })
private Company company
于 2014-10-01T12:40:47.617 回答