2010-11-18 21 views
5

¿Cómo podría continuar persistiendo un objeto que tiene un objeto java.util.Properties en él?¿Persiste java.util.Properties con Hibernate?

Tenga en cuenta que un objeto java.util.Properties tiene la capacidad de buscar propiedades no solo en sí mismo, sino también en una lista de propiedades predeterminada. La lista de propiedades predeterminada es en sí misma otro objeto Properties, por lo que también puede tener otra lista de propiedades predeterminadas. Buscar una sola propiedad podría atravesar múltiples objetos Properties antes de encontrar la propiedad.

La aplicación que estoy creando necesita propiedades anulables de manera jerárquica como Properties, por lo que estaba pensando en usar Properties en lugar de implementar mi propia estructura de datos. Pero estoy confundido sobre cómo los persistiría.

  • ¿Tendría que crear un UserType personalizado? ¿Alguna sugerencia sobre cómo hacer esto para esta situación?
  • ¿Alguien sabe de un instructivo u otro recurso que demuestre cómo persistir las propiedades en Hibernate?

Respuesta

3

La primera pregunta es: ¿necesita almacenar los metadatos de la jerarquía, o simplemente desea almacenar todas las propiedades. Si es el caso letra, a continuación, sólo tiene que añadir todas las propiedades (utilizando getPropertyNames()) a un extremo Map persistirlo (persistiendo mapas es casi trivial)

Si desea conservar la jerarquía, a continuación, una pregunta es - ¿cómo debe esto se representa en la base de datos.

La forma más sencilla que imagino es tener una tabla con las siguientes columnas:

id | key | value | properties_set_id | parent_properties_set_id 

Pero cómo hacerlo - No puedo pensar en forma inmediata. Quizás persista un Set<PropertyEntry>.

+0

Bozho, supongo que harías la instancia de Propiedades transitoria, pero ¿en qué punto exportas las propiedades a un mapa? No estoy seguro de la mecánica de cuándo hacerlo realidad. –

+0

@Jason Nichols Lo quise decir como un proceso manual. O tal vez un oyente de eventos '@ PreX'. Tal vez es posible a través de un UserType, pero nunca lo he escrito, así que no puedo decirlo. – Bozho

4

no estoy seguro de si es una "porción de pastel", pero como puede almacenar el XML de una instancia de Propiedades y cargar una instancia de un XML, podría tener una propiedad @Lob en su entidad que contenga el XML que ser persistido Algo así como:

class MyEntity implements Serializable { 
    @Transient 
    Properties props; 

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

    //ids, getters & setters ommited 

} 

Y a continuación, se puede implementar un DAO para hacer el trabajo duro de la persistencia y la recuperación de su entidad:

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

Verificar métodos storeToXML y LoadFromXML en la API java.util.Properties.

Espero que esto ayude;

+0

Muy interesante Lucas. El único problema que tengo con este método es que no podré buscar en base a los pares clave/valor en las propiedades. ¿Conoces alguna forma de evitar eso? –

+0

Esencialmente podría cambiar el xmlProp de byte [] a String, completar una cadena con el contenido de ByteArray * y persistir el xml en sí mismo en esa propiedad. Eso le daría la posibilidad de consultar los datos, pero parece un poco hacky.¿Qué tipo de consulta estás tratando de ejecutar? –

Cuestiones relacionadas