2015-04-06 98 views
0

我喜欢像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 
} 

这个类是我的制定者和获取者所在的地方。和我可能需要的这个模型的其他功能。

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);,但它看起来错了。 :)

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

回答

0

与坚持的逻辑是不是一个真正的好主意,可以随意组合自己的实体,这是因为:

  • 你不能很好地控制事务边界(您保存方法假定有过程中没有事务,所以它试图创建一个)
  • Entity类对Hibernate API类有依赖关系,所以如果你打算把它们导出到UI层,UI也需要依赖Hibernate。

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

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

+0

我将首先关注这一点,然后再提升它。无论如何,save()函数存在并且因为超类(超类)而被调用。在创建的实例子上。save()它还没有真正保存,因为它仍然会进入超类的save()函数中,因为它没有被覆盖。现在,一旦进入,问题是session.save(newInstance),我不知道如何传递“newInstance”变量,它是主函数“sub”中创建的实例。 – oneofakind 2015-04-06 08:39:27

+0

'Superclass' newInstance是一个实例属性,你的''''方法应该可能保存'this'引用。 – 2015-04-06 09:04:44

+0

不,因为首先newInstance变量尚未被声明为值或在任何点实例化。它可能已经被声明为超类的全局变量,但就是这样,它还没有价值。或者你是否说我应该做一些像session.save这样的事情?代替? – oneofakind 2015-04-06 12:41:03

相关问题