下面是我们改进过的Person类的Hibernate映射文件
<?XML version=
?>
<hibernatemapping package=mypackage>
<class name=Person table=PERSON>
<id name=id column=ID>
<generator class=assigned />
</id>
<version name=version column=VERSION unsavedvalue=null />
<! Map Personspecific properties here >
</class>
</hibernatemapping>
注意id下面的generator标签包含了属性class=assigned这个属性告诉Hibernate我们不是让数据库指派id值而是在我们的代码里面指派id值Hibernate会简单地认为即使是新的没有经过保存的对象也有id值我们也给version标签新增了一个unsavedvalue=null的属性这个属性告诉Hibernate应该把version值而不是id值为null作为对象是新创建而成的指示器我们也可以简单的告诉Hibernate把负值作为对象未经保存的指示器如果你喜欢把version字段的类型设置为int而不是Integer这将是很有用的
我们已经从改用这样的纯净的对象id中获取了不少好处我们对equals()和hashCode()方法的实现更加简单而且容易阅读这些方法再也不易出错而且无论在保存对象之前还是之后它们都能和Collection一起正常工作Hibernate也能够变的更快一些这是因为在保存新的对象之前它再也不需要从数据库读取一个序列值此外新定义的equals()和hashCode()对于一个包含id对象的对象来说是具有通用性的这意味着我们可以把这些方法移动到一个抽象的父类当中去我们不再需要为每一个域对象重新实现equals()和hashCode()而且我们也不再需要考虑对于一个类来说哪些字段的组合是唯一且不变的我们只要简单地继承这个抽象类当然我们没必要强迫我们的域对象继承一个父类所以我们定义了一个接口来保证设计的灵活性
public interface PersistentObject {
public String getId();
public void setId(String id);
public Integer getVersion();
public void setVersion(Integer version);
}
public abstract class AbstractPersistentObject implements PersistentObject {
private String id = IdGeneratorcreateId();
private Integer version;
public String getId() { return id;
}
public void setId(String id) { thisid = id; }
public Integer getVersion() { return version; }
public void setVersion(Integer version) { thisversion = version; }
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || !(o instanceof PersistentObject)) { return false; }
PersistentObject other = (PersistentObject)o;
// if the id is missing
return false
if (id == null) return false;
// equivalence by id
return idequals(othergetId());
}
public int hashCode() {
if (id != null) {
return idhashCode();
} else {
return superhashCode();
}
}
public String toString() {
return thisgetClass()getName() + [id= + id + ];
}
}
现在我们有了一个简单而高效的方法来创建域对象它们继承了AbstractPersistentObject这个父类能在它们第一次被创建时自动赋予它们一个id并且恰当的实现了equals()和hashCode()这两个方法域对象也得到了一个对toString()方法的合理的缺省实现这个方法可以有选择地被重写如果这是一个查询例子的测试对象或者例子对象id值时可以被改变或者被设为null否则它是不应当被改变的如果因为某些原因我们需要创建一个继承自其它类的域对象这个对象就应当实现PersistentObject接口而不是继承抽象类
[] [] [] [] []