子类也必须遵守第一条和第二条规则。它从Cat继承了标识属性。
package eg; public class DomesticCat extends Cat { private String name; public String getName() { return name; } protected void setName(String name) { this.name=name; } }
作为一个可选的步骤,可持久化类可以实现Lifecycle接口,它可以提供一些用于回调的方法,可以让持久化对象在save或load之后,或者在delete或update之前进行必要的初始化与清除步骤。
public interface Lifecycle { public boolean onSave(Session s) throws CallbackException;public boolean onUpdate(Session s) throws CallbackException;
public boolean onDelete(Session s) throws CallbackException;
public void onLoad(Session s, Serializable id);
}
![]() |
onSave - 在对象即将被save或者insert的时候回调 |
![]() |
onUpdate - 在对象即将被update的时候回调(也就是对象被传递给Session.update()的时候) |
![]() |
onDelete - 在对象即将被delete(删除)的时候回调 |
![]() |
onLoad - 在对象刚刚被load(装载)后的时候回调 |
onSave(), onDelete() 和 onUpdate() 可以被用来级联保存或者删除依赖的对象。这种做法是在映射文件中声明级联操作外的另外一种选择。onLoad()可以用来让对象从其持久化(当前)状态中初始化某些暂时的属性。不能用这种方式来装载依赖的对象,因为可能无法在此方法内部调用Session接口。 onLoad(), onSave()和 onUpdate()另一种用法是用来在当前Session中保存一个引用,已备后用。
请注意onUpdate()并不是在每次对象的持久化状态被更新的时候就被调用的。它只在处于尚未被持久化的对象被传递给Session.update()的时候才会被调用。
如果onSave(), onUpdate() 或者 onDelete()返回true,那么操作就被悄悄地取消了。如果其中抛出了CallbackException异常,操作被取消,这个异常会被继续传递给应用程序。
请注意onSave()是在标识符已经被赋予对象后调用的,除非是使用本地(native)方式生成关键字的。
如果持久化类需要在保存其持久化状态前进行合法性检查,它可以实现下面的接口:
public interface Validatable { public void validate() throws ValidationFailure; }
如果发现对象违反了某条规则,应该抛出一个ValidationFailure异常。在Validatable实例的validate()方法内部不应该改变它的状态。
和Lifecycle接口的回调方法不同,validate()可能在任何时间被调用。应用程序不应该把validate()调用和商业功能联系起来。