2012-10-17 171 views
5

我有一個要在數據庫中保存的單例。其他持久實體應該引用這個單例。 Hibernate如何實現?休眠/持久化和單例模式

我的東西還未這樣工作,僞裝單身的單ID結束:

@Entity 
@Subselect("select '1' as ID") 
class Singleton { 
    @Id 
    @Column(name="ID") 
    private Long getId() { return 1l; } 
    private void setId(Long id) { } 
} 

@Entity 
@Table(name="ENT") 
class MyEnt { 
    // TODO: how to annotate so that table ENT doesn't need foreign key column 
    Singleton s; 
} 

的問題是,我不希望有與實體的外鍵引用的列單身人士 - 因爲單身人士只有一個,我們不需要它的ID ...

也許我在想錯誤的方式嗎?也許這是錯誤的架構問題?你有沒有解決類似的問題?

回答

0

如果Singleton只是一個對象,爲什麼要將它映射到其他實體?

您可能要加載Singleton一次,並將其放入application context。在這種情況下,您可以在需要時重複使用它。

+0

是但如果你需要重新啓動容器或你有很多集裝箱?如何保存單身人士的當前狀態?或者在所有的容器中改變它? – ElderMael

+0

我的意思是以設計的方式擁有這個對象。所有我想這麼說,我沒有看到任何其他實體映射的原因。加載對象一次,並保持在應用程序上下文中。如果您碰巧重新啓動容器,請重新加載。 –

+0

1.因爲數據可以在數據庫中更改(webapp在更多節點上)2.因爲實體在其業務邏輯方法中需要單例。我不想將它放在「手動」的位置。它可以通過DAO服務爲由此DAO服務加載的實體完成,但是如何處理間接加載的實體(由原始實體引用)? – Jakub

1

我這個結束:

@Entity 
@Subselect("select '1' as ID, * from TABLE") 
class Singleton { 
    @Id 
    @Column(name="ID") 
    private Long getId() { return 1l; } 
    private void setId(Long id) { } 
    // ... other useful fields persisted in TABLE 
} 

@Entity 
@Table(name="ENT") 
class MyEnt implements Lifecycle { 
    Singleton s; 
    void onLoad(Session sess, Serializable id) { 
     this.s = sess.get(Singleton.class, 1l); 
    } 
    // etc... 
}