2013-05-19 52 views
2

在Hibernate实体中使用ManyToOne关联的两侧是否适合使用Cascade?为了使我的问题更具体,让我们假设某人有以下相关实体:在ManyToOne关系中使用级联

public class Department 
    { 
    public long id; 

    @OneToMany(mappedBy = "department", cascade=cascadeType.REMOVE) 
    private Set<Employee> employees; 
    } 

    public class Employee{ 

    @GeneratedValue(strategy=GeneratedValue.identity) 
    public longempid; 

    @ManyToOne 
    public Department department; 
    } 

在上面的关系Department有很多Employees,因此它是合理的强制Employees被删除时,Department被删除。我对吗?

但是,关系的所有者是Employee。因此,我的问题是,什么是适当的正确选择,在哪里放置cascadeType.PERSIST。我可以根据特殊需要选择其中一个,还是我可以把它放在双方?如果我把它放在Department那边,下面的代码是否也保存了Employees,考虑到Employee所有者的关系?

Employee e1 = new Employee(); 
Employee e2 = new Employee(); 
Department d = new Department(); 
d.getEmployees.add(e1); 
d.getEmployees.add(e2); 
em.persist(d); 

我几乎可以肯定,如果相反的作品,我把cascadeType.PERSISTEmployee侧(保存Employee将保存Department为好)。

回答

2

首先,在您发布的代码中,员工不是该协会的所有者。请将协会是双向的,如果一对多关联因而具有mappedBy属性定义:

@OneToMany(mappedBy = "department", cascade = cascadeType.REMOVE) 
private Set<Employee> employees; 

(请注意,我也做了场私人公共字段不应该被使用。)。

关于拆除部门:在我的公司,部门被拆除时,所有员工都不会自动开除。他们可以被分配到另一个部门,甚至可以留在公司而不受部门的影响,但他们不会被删除。我了解您的应用程序不一定会模拟真实世界,但不是,删除部门时强制删除员工未必合理。

现在,假设映射如上,是的,您可以完美地将一个PERSIST级联添加到OneToMany关联。叶栅和所有权是正交的概念。如果您希望将persist()操作从部门级联到其员工(即如果要在创建部门时创建员工),请添加该级联。对于要保存的关联,由于所有者一方是Employee,所以employee.department字段必须正确初始化。

+0

对于mappedBy你是对的,因此我更新了这个问题。从你的答案我推断你的建议是,cascadeType.PERSIST可以用于双方,它的工作原理。我对吗? – arjacsoh

+0

是的。它工作正常。你为什么不测试它? –

+0

我当然想尝试一下,但是阻碍了我在我的电脑上使用Hibernate。看到我的相关答案设想的原因:http://stackoverflow.com/questions/16638930/hibernate-does-not-create-table-in-the-database – arjacsoh