ITEEDU

4.2. 继承(Inheritance )

子类也必须遵守第一条和第二条规则。它从Cat继承了标识属性。

package eg;

public class DomesticCat extends Cat {
        private String name;

        public String getName() {
                return name;
        }
        protected void setName(String name) {
                this.name=name;
        }
}

4.3. 持久化生命周期(Lifecycle)中的回调(Callbacks)

作为一个可选的步骤,可持久化类可以实现Lifecycle接口,它可以提供一些用于回调的方法,可以让持久化对象在save或load之后,或者在delete或update之前进行必要的初始化与清除步骤。

public interface Lifecycle {
        public boolean onSave(Session s) throws CallbackException;   (1)
        public boolean onUpdate(Session s) throws CallbackException; (2)
        public boolean onDelete(Session s) throws CallbackException; (3)
        public void onLoad(Session s, Serializable id);              (4)
}
1

onSave - 在对象即将被save或者insert的时候回调

2

onUpdate - 在对象即将被update的时候回调(也就是对象被传递给Session.update()的时候)

3

onDelete - 在对象即将被delete(删除)的时候回调

4

onLoad - 在对象刚刚被load(装载)后的时候回调

onSave(), onDelete() 和 onUpdate() 可以被用来级联保存或者删除依赖的对象。这种做法是在映射文件中声明级联操作外的另外一种选择。onLoad()可以用来让对象从其持久化(当前)状态中初始化某些暂时的属性。不能用这种方式来装载依赖的对象,因为可能无法在此方法内部调用Session接口。 onLoad(), onSave()和 onUpdate()另一种用法是用来在当前Session中保存一个引用,已备后用。

请注意onUpdate()并不是在每次对象的持久化状态被更新的时候就被调用的。它只在处于尚未被持久化的对象被传递给Session.update()的时候才会被调用。

如果onSave(), onUpdate() 或者 onDelete()返回true,那么操作就被悄悄地取消了。如果其中抛出了CallbackException异常,操作被取消,这个异常会被继续传递给应用程序。

请注意onSave()是在标识符已经被赋予对象后调用的,除非是使用本地(native)方式生成关键字的。

4.4. 合法性检查(Validatable)

如果持久化类需要在保存其持久化状态前进行合法性检查,它可以实现下面的接口:

public interface Validatable {
        public void validate() throws ValidationFailure;
}

如果发现对象违反了某条规则,应该抛出一个ValidationFailure异常。在Validatable实例的validate()方法内部不应该改变它的状态。

和Lifecycle接口的回调方法不同,validate()可能在任何时间被调用。应用程序不应该把validate()调用和商业功能联系起来。