【发布时间】:2016-03-02 09:16:03
【问题描述】:
我的 Java 项目使用 JPA 作为持久性解决方案。随着我阅读越来越多的 JPA 教程和指南,我发现(可能是为了简单起见)每个作者都使用实体类作为他们的模型类。就代码可扩展性和可维护性而言,这显然是一个糟糕的设计选择:更改持久性解决方案的决定将意味着对整个模型进行完全重构(或重写)。
事情是,重写与每个实体类对应的模型类感觉不合适且不优雅,因为如果不是 JPA 注释,所有这些都将与相应的实体类相同(在我个人的情况下)。将它们写为实体类实现的接口也感觉不对,无论是因为当我可能需要使用不对应于实体的类扩展模型时出现潜在的不一致,还是因为在 Java 中泛型用于表示 @OneToMany 和 @ManyToMany 关系不(也不应该)与抽象接口协变。
我现在将发布一些代码来说明我的担忧:
package com.depvin.pps.orm;
import javax.persistence.*;
@Entity
@DiscriminatorValue("E")
public class EmployeeEntity extends UserEntity {
@ManyToMany
@JoinTable(name = "EmployeeProject",
joinColumns = @JoinColumn(name = "employee"),
inverseJoinColumns = @JoinColumn(name = "project"))
List<ProjectEntity> projects;
public EmployeeEntity(String username) {
super(username);
}
public List<ProjectEntity> getProjects() {
return projects;
}
}
考虑到我上面提的问题,对应的模型类/接口应该如何实现?
【问题讨论】:
-
为什么您认为更改持久性解决方案需要对模型类进行“完全重构或重写”?我认为可以将此类与另一种持久性技术原样使用,并且删除注释几乎不符合完全重构或重写的条件,是吗?特别是因为这些注释中的大多数都是可选的,并且只有在您想要覆盖列的默认名称时才需要?
-
一个问题带有流控制注释,如 PrePersist PostPersist。一种新的持久性技术必须至少具有相同的断言。我认为情况会如此,但您清楚地看到,代码执行绑定到 JPA。这应该没什么大不了的,但它显示了对 JPA 的控制流依赖。所以注释不仅仅是类的元数据。它们也是 JPA 环境何时执行什么的数据。
标签: java jpa architecture modularity