我正在Hibernate中开发一个应用程序,我有这样的模型类:
public class Employee
{
private int ID;
private String name;
private Department department;
//other properties
//constructors, getters and setters
}
Run Code Online (Sandbox Code Playgroud)
请注意,该ID值不是用户填充的值,而是使用GenerationType.Identity作为填充的值填充strategy.
我还有另一个课程Department如下:
public class Department
{
private int ID;
private String name;
private Set<Employee> employees; //this is actually a HashSet
//other implementations
}
Run Code Online (Sandbox Code Playgroud)
a 和a ManyToOne之间存在双向关系.EmployeeDepartment
因此,要向Employee现有内容添加新内容Department,请执行以下操作
Department existingDepartment = ...;
Employee newEmployee = ...;
existingDepartment.addEmployee(newEmployee);
employee.setDepartent(existinDepartment);
session.save(newEmployee);
Run Code Online (Sandbox Code Playgroud)
现在从概念上讲Employee,如果它们具有相同的两个对象是相同的ID.所以我equals()在Employee班上的方法看起来像这样:
public boolean equals(Object o)
{
if(!(o instanceOf Employee))
{
return false;
}
Employee other = (Employee)o;
if(this.ID == o.etID())
{
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是当我创建一个new Employee();我没有它的时候ID,因为它将在它被持久化时被分配.所以,当我说
existingDepartment.addEmployee(newEmployee);
Run Code Online (Sandbox Code Playgroud)
内部HashSet的的Department对象被有效地使用equals(),其被分解方法[因为它使用一个成员变量,以确定平等,由于没有被正确初始化.
这似乎是一个非常基本的问题但是,我该如何解决呢?或者我设计的课程完全错了?或者我的equals方法应该重写以比较其他值而不是ID,我想这将是荒谬的.
这似乎是一个非常基本的问题但是,我该如何解决呢?或者我设计的课程完全错了?或者我应该重写我的equals方法来比较其他值而不是ID,我想这将是荒谬的.
关于这一点有两种不同的哲学.
a)基于DB id的equals()/ hashCode()
缺点:您无法比较持久对象和非持久对象
b)基于内容的equals()/ hashCode()
缺点:具有相同id的两个对象可能会变得不相等.
我更喜欢第二种方法,从Java的角度来看它更有意义(虽然不可能从数据库的角度来看).我唯一想确定的是你永远不会混淆这些方法.
这已经多次讨论过了,顺便说一下:
| 归档时间: |
|
| 查看次数: |
1847 次 |
| 最近记录: |