gpt4 book ai didi

java - 无法获取 CascadeTypes 的使用

转载 作者:行者123 更新时间:2023-12-02 05:24:57 24 4
gpt4 key购买 nike

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

Company.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)

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

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

最佳答案

您已在 Department 实体中将 CascadeType 设置为 PERSIST,因此必须使用 session.persist(Object) 方法而不是 >保存

所以使用这个:

session.persist(department);

更新:

Company 实体在 Department 上将 CascadeType 设置为 ALL。同样,在一对多关系中,多方(部门)是关联的所有者。

因此,如果您保存Company而不是Department,则CascadeType.ALL适用。由于公司不是关联的所有者,因此您必须将部门添加到您的公司以维持双向关系。代码如下所示。

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

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

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

关于java - 无法获取 CascadeTypes 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26140814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com