如何将子类的实例传递给超类

时间:2015-04-06 01:05:00

标签: java hibernate inheritance polymorphism

我喜欢像Superclass1-> subclass1-> subclass2这样的3层固有。我正在使用hiberate创建这个项目,基本的想法是,当持久化数据时,我想在Superclass1级别执行它。因此,任何扩展该超类的人都可以通过调用方法将任何数据保存在相应的表中。

我这样做的主要目的是为了有一种事件时间,我可以随时覆盖它。它是这样的:

这使我的模型能够在更高层次上执行我需要的功能。

public class interfaces SuperModifier() {

    Boolean save();

    void beforeSave();

    void afterSave();

    void delete();
}

这实现了接口类。执行save()和其他iplemetned函数。我已经很好用会话部分了,我已经能够保存数据了。我只是增强了我的代码以实现可伸缩性,并且可以重用。

public class Superclass implements SuperModifier{

    Object newInstance;

    public Boolean save() {

        try {

            Session session = HibernateSessionFactory.getSessionFactory().openSession();
            Transaction transaction = session.beginTransaction();
            session.save(newInstance); <-- this part rigth here
            transaction.commit();

        } catch (Exception e) {
          // TODO: handle exception
           e.printStackTrace();
           transaction.rollback();
        }
    }

    ....
}

这是我用注释定义所有列的地方。

public class Subclass1 extends Superclass() {

    // because this is hibernate
    // I placed all my defintion of columns here
}

这个类是我的setter和getter所在的位置。以及此模型可能需要的其他功能。

public class Subclass2 extends Subclass1() {


    // I placed all functions here like setters and getters
}

当然还有主要功能。

public static void main(String args[]) {

    Subclass2 sub = new Subclass2();
    sub.setName("New Instance");
    sub.save(); // <--called because of the superclass
}

你看到 session.save(newInstance); 这一行,newInstance变量就是我遇到的麻烦。如何传递在main方法中创建的实例以便能够保存在其超类中?

我正在考虑通过构造函数传递它,但它不可能因为它尚未创建。我也在考虑在超类中设置一个setter来设置newInstance,但是什么时候执行set?

我还在想 sub.save(sub); ,但它看起来不对。 :)

有什么想法吗?我希望你明白我的观点。我的结构错了吗?如果有,有什么建议吗?

1 个答案:

答案 0 :(得分:0)

将实体与持久逻辑混合起来并不是一个好主意,因为:

  • 您无法正确控制事务边界(您的save方法假定没有正在进行的事务,因此它会尝试创建一个事务)
  • Entity类依赖于Hibernate API类,因此如果您想将它们导出到UI层,UI也需要依赖Hibernate。

尝试在服务层中分离持久逻辑。

至于你的问题,子类实体也是一个超类实体,所以你只需要保存一次。