持久化用于XML序列化的BO

时间:2014-04-03 16:46:30

标签: java web-services jpa jaxb

使用同一组业务对象通过XML进行序列化(通过JAXB与JAX-WS一起使用)和持久化JPA是不是一个好主意?结合这两种范式是否有缺点?#34;进入一个班级?

我的一个班级看起来像像这样:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "testSuiteInfo", propOrder = {
    "name",
    "tests"
})
@Entity
public class TestSuiteInfo {

    @Id
    @GeneratedValue
    @XmlTransient
    protected Long id;
    protected String name;
    @XmlElement(nillable = true)
    @OneToMany
    protected List<TestInfo> tests;

    // Getters and setters go here...
}

JAX-WS正在接收该类的对象,然后由JPA保留。

1 个答案:

答案 0 :(得分:1)

我是Hyperjaxb3的作者,XJC插件,它将JPA注释添加到模式派生类中。因此,您可以采用模式,然后能够执行完整的XML-objects-DB rountrip。 MOXy可以将JPA实体映射到XML as well

现在回过头去问你的问题吧。 如果对数据库,XML表示和业务逻辑使用相同的类,那么对于所有这三个事物,您基本上具有相同的模型。如果这适合你 - 很好!在许多情况下,这确实有效,因为

  • BO往往相当简单
  • 对数据库没有特定要求(即表现)
  • 您可以控制代表您的BO的XML Schema

在这些情况下,使用具有相同类的XML对象和对象DB非常好。

现在考虑一个更复杂的案例:

  • 您无法控制XML Schema,因为它是交换接口的某种规范
  • 您有性能要求,必须相应地建模数据库架构
  • 您希望使用增值方法为您的业务逻辑创建一个优化的BO代码,而不仅仅是模式派生的东西

所有这些都对XML,JPA和BO部分提出了特定的约束/要求。只用一种型号(无论是JAXB还是JPA),您能满足所有这些要求吗?不太可能。从规范模式生成JAXB类可能会好得多,而且 - 另外 - 仔细设计JPA实体。对,在这种情况下你需要一个映射器,但这是一个较小的邪恶。

还要考虑以下问题:

  • 如果规范架构发生变化会怎样?如果要发布另一个版本而你需要支持它吗?
  • 如果您必须在JPA或数据库中实现某些新功能,该怎么办?比如说,为了获得更好的性能而非规范化某些东西?

另一方面,如果你

  • 首先使用XML Schema并且不要太关心数据库(只需要以某种方式保留事物)或
  • 首先是JPA,并不关心XML(只需要用XML序列化内容)和
  • 不要浪费精力写作mappers

然后将JPA和JAXB放在同一个类中就可以了,为什么不呢。 (第一种方法是Hyperjaxb3,第二种方法是MOXy。)