【问题标题】:Persist java.util.Properties with Hibernate?使用 Hibernate 持久化 java.util.Properties?
【发布时间】:2011-05-12 00:22:10
【问题描述】:

我将如何持久化包含java.util.Properties 对象的对象?

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

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

  • 是否需要创建自定义用户类型?有关如何针对这种情况执行此操作的任何指示?
  • 有人知道如何在 Hibernate 中持久保存属性的操作指南或其他资源吗?

【问题讨论】:

    标签: java hibernate orm properties persistence


    【解决方案1】:

    不确定它是否是“小菜一碟”,但由于您可以从 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;
       }
     }
    

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

    希望这会有所帮助;

    【讨论】:

    • 非常有趣的卢卡斯。这种方法的唯一问题是我无法根据属性中的键/值对进行搜索。你知道有什么办法吗?
    • 基本上你可以将 xmlProp 从 byte[] 切换到 String,用 ByteArray* 的内容填充一个字符串并将 xml 本身保存在该属性上。这将使您有可能查询数据,但它看起来有点老套。您尝试运行哪种查询?
    【解决方案2】:

    第一个问题是 - 您需要存储层次结构元数据,还是只想存储所有属性。如果是字母大小写,则只需将所有属性(使用 getPropertyNames())添加到 Map 并持久化它(持久化映射几乎是微不足道的)

    如果您想保留层次结构,那么要问的一个问题是 - 这应该如何在数据库中表示。

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

    id | key | value | properties_set_id | parent_properties_set_id
    

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

    【讨论】:

    • Bozho,我假设您将 Properties 实例设为瞬态,但是您在什么时候将属性导出到地图?我不确定何时实现它的机制。
    • @Jason Nichols 我的意思是它是一个手动过程。或者也许是一个@PreX 事件监听器。也许通过 UserType 是可能的,但我从来没有写过这样的,所以我不知道。
    猜你喜欢
    • 1970-01-01
    • 2010-09-24
    • 2013-11-12
    • 2014-12-14
    • 2010-11-24
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多