2015-04-06 145 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

相關問題