在我之前的大多数项目中,我有两个域模型,一个带有 JAXB 注释,另一个带有 JPA 注释。我知道它们可以组合成一个模型,并在同一类中具有两个注释,但根据我的经验,这种方法的权衡总是得出将它们分开的结论。单独方法的另一个优点是能够使用 XSD 创建 JAXB 类,并轻松链接到其他项目的 XSD。
在大多数情况下,我需要工厂类能够灵活创建实体的 JAXB 表示,例如
public class UserFactory
{
public UserFactory(User queryUser, String lang)
{
this.queryUser=queryUser;
this.lang=lang;
}
public JaxbUser getUser(JpaUser jpaUser)
{
JaxbUser jaxbUser = new JaxbUser();
if(queryUser.isSetId()){jaxbUser.setId(jpaUser.getId());}
if(queryUser.isSetEmail()){jaxbUser.setEmail(jpaUser.getEmail());}
if(queryUser.isSetRoles())
{
RolesFactory f = new RolesFactory(queryUser.getRoles(),lang);
jaxbUser.setRoles(f.getRoles(jpaUser.getRoles()));
}
return jaxbUser;
}
}
我创建了一个 UserFactory,其中包含单独的模板 queryUser
和支持不同语言的实体所需的 lang
。在创建特定字段或其他工厂的结果期间会检查模板,并创建结果对象。该查询在 XML 文件中定义,如下所示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<query lang="en">
<user id="1">
<roles>
<role code="code"/>
</roles>
</user>
</query>
通过这种方法,我拥有了一个强大而灵活的工具来创建定制的 XML,尽管维护两个域模型和工厂类有很多缺点。我知道有许多我从未听说过的框架或库可用,所以这里是我的问题:
是否有类似于我的方法的可用方法?
最佳答案
基本上有两种选择:
- 同一类上的 JPA 和 JAXB 注释(请参阅 Hyperjaxb3 或 DataNucleus)
- 或者您将它们分开并编写代码将一个映射到另一个
我个人认为跨模型映射代码没有太多附加值(value)。工厂的使用似乎也不是太创新,这只是一个用于将一个映射到另一个的编程技术的问题。
关于java - JPA 实体的 JAXB 工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6362755/