下面是我們改進過的Person類的Hibernate映射文件
<?XML version=
?>
<hibernate
mapping package=
my
package
>
<class name=
Person
table=
PERSON
>
<id name=
id
column=
ID
>
<generator class=
assigned
/>
</id>
<version name=
version
column=
VERSION
unsaved
value=
null
/>
<!
Map Person
specific properties here
>
</class>
</hibernate
mapping>
注意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 = IdGenerator
createId();
private Integer version;
public String getId() { return id;
}
public void setId(String id) { this
id = id; }
public Integer getVersion() { return version; }
public void setVersion(Integer version) { this
version = 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 id
equals(other
getId());
}
public int hashCode() {
if (id != null) {
return id
hashCode();
} else {
return super
hashCode();
}
}
public String toString() {
return this
getClass()
getName() +
[id=
+ id +
]
;
}
}
現在我們有了一個簡單而高效的方法來創建域對象它們繼承了AbstractPersistentObject這個父類能在它們第一次被創建時自動賦予它們一個id並且恰當的實現了equals()和hashCode()這兩個方法域對象也得到了一個對toString()方法的合理的缺省實現這個方法可以有選擇地被重寫如果這是一個查詢例子的測試對象或者例子對象id值時可以被改變或者被設為null否則它是不應當被改變的如果因為某些原因我們需要創建一個繼承自其它類的域對象這個對象就應當實現PersistentObject接口而不是繼承抽象類
[] [] [] [] []
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28968.html