使用Hibernate持久化java.util.Properties?

时间:2010-11-18 12:35:03

标签: java hibernate orm properties persistence

如何持久保存其中包含java.util.Properties个对象的对象?

请注意,java.util.Properties对象不仅可以在自身中查找属性,还可以在默认属性列表中查找属性。默认属性列表本身是另一个Properties对象,因此它也可以有另一个默认属性列表。查找单个属性可以在找到属性之前遍历多个Properties对象。

我正在构建的应用程序需要以Properties提供的分层方式覆盖属性,因此我考虑使用Properties而不是实现我自己的数据结构。但我对如何坚持他们感到困惑。

  • 我是否需要创建自定义UserType?关于如何针对这种情况做任何指示?
  • 任何人都知道如何在Hibernate中持久保存属性的方法或其他资源?

2 个答案:

答案 0 :(得分:4)

不确定它是否是“一块馅饼”的东西,但是因为你可以从一个属性实例存储XML并从XML加载一个实例,所以你的实体上可以有一个@Lob属性来保存XML持续存在。 类似的东西:

 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;
   }
 }

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

希望这会有所帮助;

答案 1 :(得分:3)

第一个问题是 - 您是否需要存储层次结构元数据,或者您只想存储所有属性。如果是字母大小写,那么只需将所有属性(使用getPropertyNames())添加到Map端,就可以保留它(持久化地图几乎是微不足道的)

如果你想保留层次结构,那么要问的问题是 - 如何在数据库中表示。

我想象的最简单的方法是让一个表包含以下列:

id | key | value | properties_set_id | parent_properties_set_id

但如何做到这一点 - 我无法立刻想到。也许坚持Set<PropertyEntry>