2010-11-18 115 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

相关问题