2012-10-08 40 views
1

我有兩個Java類冬眠,A & B,以A持有參考B:ORM - 混合與存儲器內數據

public class A { 
    private long id; 
    private B b; 
    ... 
} 

public class B { 
    private long id; 
    ... 
} 

在我的數據庫只有A的實例被存儲,沿着與所述的引用B的ID:

$ select * from tableA; 
id | bid | ... 
--------------- 
1 | 42 | 
2 | 42 | 
3 | 43 | 
... 

然而,B是存儲在數據庫中,但可通過1個服務層ServiceB的一些實施:

public interface ServiceB { 
    public B getB(long bid); 
} 

我該如何使用Hibernate建模?我最好使用基於XML的HBM配置。我也想避免在A出價中添加一個瞬間字段(如果可能的話)。

回答

0

我在這裏發佈的解決方案找到供參考。

您必須創建自定義休眠UserType,它用於A類中的bid字段的映射。實施UserType已經在互聯網上得到了很好的解釋,這裏不是重點。只要通過從服務層加載相應的B,nullSafeGet()操作將數據庫ID轉換爲B實例;和nullSafeSet(),反過來,將B實例轉換爲它的內部ID以存儲到數據庫。

根據所使用的注入框架(Guice,Spring,自定義解決方案...),將此自定義用戶類型鏈接到服務層可以通過多種方式完成,但不應該是一個問題。

對於每個引用類B,您需要定製UserType。使用泛型對於從一個通用基類派生出來的幾個引用類來說可能是有用的,它作爲練習留給讀者。

0

介紹一個Repository並建立基於A & B. 一個新對象Repository使用Hibernate來retriebv A和服務檢索B

+0

我想避免這種情況,因爲我有很多_real_ A,並且不想在它們之上引入新的額外層。另外我也沒有看到我可以如何將B id映射到B w/o,不必添加額外的字段'A.bid'。 –

0

您需要開發一個新的org.hibernate.persister.entity.EntityPersister。這基本上就是Hibernate OGM(使用NoSQL背景的Hibernate + JPA)所做的事情,如果你需要一個關於如何實現它的參考。您將繼續爲關係實體使用標準持久化,並將您的自定義持久化用於非關係實體。