我有一个实体类“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。
有没有办法为服务器端和客户端模块使用单个类?
最佳答案
您可以简单地尝试在这两种情况下使用相同的类。它应该有效。这就是我在早期项目之一开始时尝试的方法。只要您能够仔细处理从客户端收到的 ClassA
的 JPA 合并,将其视为独立实体即可。
但是,当您的实体设计变得更加复杂时,您将面临很多问题(这就是我在项目中放弃这种方法的原因:P)。最大的问题之一是,假设您已经对实体关系进行了建模,一旦您尝试“序列化”它以供客户端使用,很多(JAXB 等,当时我正在做项目)解决方案将递归地跟踪所有的关系并尝试转换它。这种行为将触发大量实体的延迟获取,并使结果序列化形式包含大量(未使用的)数据。尽管您可以控制行为(通过添加某种忽略注释等),但结果实体将变得难以维护。
因此,恕我直言,你所做的并不是没有道理的。您需要注意的是,将值对象(您称为“模型”)视为“表示”。您不需要使其与您的实体严格相同。
利用/开发一些util库来处理从实体构造值对象,并将数据从值对象填充回实体。
当然,鉴于您还没有分享太多关于您的架构的信息,该建议可能不适用于您。
关于java - 如何使用 java 类作为实体和模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39635150/