2010-11-18 121 views
5

我該如何去堅持一個擁有java.util.Properties對象的對象呢?使用Hibernate持久化java.util.Properties?

請注意,java.util.Properties對象不僅可以在其本身中查找屬性,還可以在默認屬性列表中查找屬性。默認屬性列表本身就是另一個Properties對象,所以它也可以有另一個默認屬性列表。在找到屬性之前,查找單個屬性可能會遍歷多個Properties對象。

我正在構建的應用程序需要可覆寫的屬性,像Properties提供的分層方式,所以我想用Properties而不是實現我自己的數據結構。但我很困惑我將如何堅持他們。

  • 我需要創建一個自定義的UserType嗎?任何關於如何做到這一點的指針?
  • 任何人都知道一個怎麼樣或其他資源演示如何在Hibernate中持久化屬性?

回答

3

第一個問題是 - 您是否需要存儲層次結構元數據,或者您只是想存儲所有屬性。如果是字母的大小寫,後來乾脆所有屬性(使用getPropertyNames())添加到Map堅持到底它(堅持地圖幾乎是微不足道的)

如果您想保留層級,那麼要問的問題是 - 如何應這將在數​​據庫中表示。

我想到的最簡單的方法是有一個表有以下欄目:

id | key | value | properties_set_id | parent_properties_set_id 

但如何做到這一點 - 我想不出立即。也許堅持Set<PropertyEntry>

+0

Bozho,我假設你會讓屬性實例爲瞬態的,但是在什麼時候將屬性導出到地圖?我不確定何時實現它的機制。 – 2011-03-24 13:06:18

+0

@Jason Nichols我的意思是一個手動過程。或者可能是'@ PreX'事件監聽器。也許它可以通過UserType,但我從來沒有寫過,所以我不能說。 – Bozho 2011-03-24 13:15:39

4

不確定它是否是一塊「餡餅」,但由於您可以從一個Properties實例存儲XML並從XML加載一個實例,因此您可以在持有XML的實體上擁有一個@Lob屬性,堅持。 喜歡的東西:

class MyEntity implements Serializable { 
    @Transient 
    Properties props; 

    @Lob 
    byte[] xmlProp; //the xml as a byte[] 

    //ids, getters & setters ommited 

} 

然後你就可以實現一個DAO做到堅持和檢索您實體的辛勤工作:

class MyEntityDAO { 

    public void persist(MyEntity entity){ 

    try { 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     entity.getProps().storeToXML(bos, "a simple comment if you like"); 

     byte[] byteStream = bos.toByteArray(); 
       entity.setXmlProp = byteStream; 

       //save your instance with hibernate... 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    } 

    public MyEntity retrieveById(Long id){ 

     Properties propFromDB = new Properties(); 

     MyEntity ent = //retrieve the instance with hibernate... 

     try{ 
     Properties propFromDB = new Properties(); 
     ByteArrayInputStream bais = new ByteArrayInputStream(ent.getXmlProp()); 
     propFromDB.load(bais); 
     ent.setProp(propFromDB); 
     return ent; 
     } catch (IOException ioe){ 
     ioe.printStackTrace(); 
     } 
     return null; 
    } 
} 

檢查方法storeToXML和loadFromXML在java.util.Properties API。

希望這有助於;

+0

非常有趣的盧卡斯。我用這種方法唯一的問題是,我將無法基於屬性中的鍵/值對進行搜索。你知道有什麼方法嗎? – 2011-03-24 13:04:38

+0

實質上,您可以將xmlProp從byte []切換到String,並使用ByteArray *的內容填充字符串,並在該屬性上保留xml本身。這會給你查詢數據的可能性,但它看起來有點怪異。你試圖運行什麼類型的查詢? – 2011-03-24 20:51:59

相關問題