如何将java类用作实体以及作为模型

时间:2016-09-22 09:25:32

标签: java hibernate java-8 pojo spring-4

我有一个实体课" classA"和模型类" ClassA1"。 ClassA用于从服务器端存储mysql数据库中的值,ClassA1用于将API响应字符串转换为客户端的对象。

现在我有两个具有相同getter和setter的java类,但ClassA包含hibernate注释,而ClassA1只是一个POJO。考虑以下类结构

ClassA.java

@Entity
@Table(name="classA")
public class ClassA {
    @Id
    private int id;
    private String name;

    public int getId() {
        return id
    }

    public void setId(int id) {
        this.id = id;
    }

    @Column(name="name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

ClassA1.java

public class ClassA1 {
    private int id;
    private String name;

    public int getId() {
        return id
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

我的应用程序包含更多如上所述的类。我想避免这种情况,因为如果我向数据库中添加任何列,目前我在ClassA和ClassA1中都添加了getter和setter。

有没有办法为服务器端和客户端模块使用单个类?

2 个答案:

答案 0 :(得分:1)

您可以在两种情况下尝试使用相同的类。它应该工作。这就是我在之前的一个项目开始时尝试的方式。只要您可以通过将其视为独立实体来仔细处理从客户端收到的ClassA的JPA合并。

但是,当您的实体设计变得更加复杂时,您将面临很多问题(这就是为什么我在项目中改变这种方法的原因:P)。最重要的问题之一是,一旦你试图对序列化"它供客户使用,很多(JAXB等,当时我正在做项目)解决方案将递归追踪所有关系并尝试转换它。这种行为将触发实体的大量延迟获取,并使结果序列化形式包含大量(未使用)数据。虽然您可以控制行为(通过添加某种忽略注释等),但结果实体将变得很难维护。

因此,你在做什么,imho,并非不合理。你需要注意的是,将值对象(你所谓的"模型")视为" presentation"。您不需要使其与您的实体严格相同。

利用/开发一些util库来处理实体中值对象的构造,并将值对象中的数据填充回实体。

当然,这个建议可能不适用于你,因为你没有在你的架构上分享太多。

答案 1 :(得分:1)

您可以在XML文件中单独指定Hibernate映射,而不是使用注释。这是旧的方式,现在大多数人使用注释,因为它更方便,并遵循JPA标准(主要是)。

另一个解决方案是使用像Dozer这样的bean映射框架来使映射更容易。

将架构中视图使用的持久性(JPA)实体和值对象分开是很常见的。您可以为使用它们的视图自定义值对象。也许视图不需要完整的User实体,只需要id,name和address?如果是这种情况,它会使视图和后端之间的通信更轻,并部分解决ValueObjects和持久实体之间的重复问题。