如何持久保存其中包含java.util.Properties
个对象的对象?
请注意,java.util.Properties
对象不仅可以在自身中查找属性,还可以在默认属性列表中查找属性。默认属性列表本身是另一个Properties
对象,因此它也可以有另一个默认属性列表。查找单个属性可以在找到属性之前遍历多个Properties
对象。
我正在构建的应用程序需要以Properties
提供的分层方式覆盖属性,因此我考虑使用Properties
而不是实现我自己的数据结构。但我对如何坚持他们感到困惑。
答案 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>
。