如您所知,您可以在Hibernate中声明与ExtraLazy语义的OneToMany关联,这意味着size(),contains()和其他可能变得更聪明。它将运行特定的SQL语句,不会初始化整个集合。大型收藏的绝佳功能。
看起来像contains()方法,只比较Id(主键)。假设这个例子:
class Department {
........
@OneToMany(mappedBy = "department", cascade = CascadeType.ALL, fetch= FetchType.LAZY)
@LazyCollection(LazyCollectionOption.EXTRA)
private Collection<Employee> employees = new ArrayList<Employee>();
.........
public void addEmployee(Employee e) {
if (!this.employees.contains(e)) {
employees.add(e);
e.setDepartment(this);
}
}
}
上面的代码是一个Department类,它使用ExtraLazy与Employee(另一个实体)建立OneToMany关联。在addEmployee()方法中,我使用了PersistentBag的方法contains()。
当我看到Hibernate生成的SQL语句时,我看到它通过Employee的ID发出了一个SQL比较。 如果我想通过名称检查Employee是否存在怎么办?由于我不想在Deparment中使用同名的Employee?还是员工的其他领域?有没有办法做到这一点?