我正在寻找一种使用Hibernate在数据库中保存XML文件的解决方案。
问题是,XML文件的结构与Hibernate-beans不同。
我正在尝试使用JAXB将XML内容序列化为Hibernate bean。
请想象以下场景: 有这个xml文件:
<root>
<general>
<property1/>
<property2/>
</general>
<details>
<detail1>
<detail2>
</root>
现在我想将property1和detail1保存在一个bean中:
@Entity
@Table(name = "tablename")
class Bean(){
public String property;
public String detail;
//+ getters and setters ...
}
有没有人知道,我可以用哪种JAXB注解来解决这个问题?
答案 0 :(得分:1)
这样做是强制性的吗? Hibernate是一种持久性API,无论DBMS引擎或XML文件是什么,它都不关心数据的存储方式。它是持久化对象的框架。但它并不止于此,因为您可以运行查询(伪SQL或通过Criteria API),实际上在面向对象的数据存储中实际上会产生什么结果。
JAXB是一个不同的怪物,因为它旨在以XML格式保存对象,由XSD-Schema定义,因此结果数据可以在共享相同模型的系统之间进行交换。
如果以XML格式存储数据对您来说很重要,因为您使用XML,可能更有意义的是使用eXist等XML本机数据库,它允许您访问和转换XML数据。一种XML友好的方式(XSLT,XQuery,XPath)。
答案 1 :(得分:1)
看起来你正试图解决错误的问题。
简而言之,数据库可以将XML存储为CLOB或XML数据类型(基本上是clob的扩展)
在这种情况下,您可以将适当的LOB处理程序映射到hibernate对象中的字符串或byte []字段(表示完整的xml文档)。
在你的情况下,看起来你想要将一个bean编组/解组为XML ...这可以通过多个框架/库完成;如果你正在使用休眠,那真的无关紧要。
只需为转换过程创建一些静态工具。
答案 2 :(得分:1)
我刚刚完成了同样的解决方案,我所做的是使用hibernate和XStream与xstream的混合我在我的类和字段上使用了注释XStreamAlias(“”)并将它们映射到实际的xml文档并运行它们通过xstream.fromXML()创建bean然后将bean插入数据库
一些代码
@XStreamAlias("task")
public class Task {
@XStreamOmitField
private Long id;
@XStreamAlias("subject-type")
private String subject;
@XStreamAlias("body")
private String body;
@XStreamAlias("frame")
private String timeframe;
@XStreamAlias("due-at")
private String due;
@XStreamAlias("alert-at")
private String alarm;
/** Getters/Setters **/
}
<?xml version="1.0"?>
<tasks>
<task>
<subject-type></subject-type>
<body>A task for today</body>
<frame>today</frame>
<due-at type="datetime"></due-at>
<alert-at type="datetime"></alert-at>
</task>
</tasks>
// Test Case
File xml = new File("xmlfile.xml");
XStream xstream = new XStream();
xstream.processAnnotations(new Class[]{ Task.class });
xstream.alias("tasks", ArrayList.class);
List tasks = (List)xstream.fromXML(new FileReader(xml));