如何使用JAXB通过@XmlIDREF和延迟加载的公共get来封送Hibernate对象

时间:2012-03-02 12:22:03

标签: java xml hibernate jaxb marshalling

在我的Java程序中,我想将Hibernate持久对象封送到XML。 为此,我使用JAXB。问题是在编组对象时我得到NullPointerException

这是由延迟加载提取策略引起的。当切换到渴望获取编组过程时,

我使用getter而不是变量,因此Hibernate可以初始化对象。我没有LazyInitializationException因此没有关闭会话等。

伪代码:

Session s = sessionFactory.openSession();
Criteria crit = s.createCriteria(Entity.class);
List list = crit.list();
Entity entity = (Entity) list.get(0)
try {
    DocumentResult dr = new DocumentResult();
    context = JAXBContext.newInstance(entity.getclass());
    Marshaller marshaller = context.createMarshaller();
    marshaller.marshal(entity, dr);
}
catch(JAXBException e) {
    // ignore
}

1 个答案:

答案 0 :(得分:0)

如果您正在编组实体的延迟加载属性,则它不能分离,也就是说它需要与活动会话相关联。您的选择是:

  1. 保留原始实体加载的会话,足够长 完成编组。
  2. 开始新会话并将merge您的实体加入其中,然后执行 编组。
  3. 让你的懒惰加载属性急切。
  4. 另一方面,我发现你得到一个空指针异常很奇怪。您必须在代码中的某处吞下LazyInitializationException