我一直在思考我的服务器的架构,因为我正在使用Spring Boot从头开始开发我的第一个RESTful API.我正在使用Hibernate,并且我使用HibernateJPA注解创建了几个实体和它的关系,然而,我不确定我是否应该使用这些实体作为业务模型,因为它们是 "肮脏 "的,有Hibernate推荐的额外字段。
这是直接从Hibernate的文档中提取的一个例子。
@Entity(name = "Person")
public static class Person implements Serializable {
@Id
@GeneratedValue
private Long id;
@NaturalId
private String registrationNumber;
@OneToMany(
mappedBy = "person",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PersonAddress> addresses = new ArrayList<>();
// ...
public void addAddress(Address address) {
PersonAddress personAddress = new PersonAddress( this, address );
addresses.add( personAddress );
address.getOwners().add( personAddress );
}
public void removeAddress(Address address) {
PersonAddress personAddress = new PersonAddress( this, address );
address.getOwners().remove( personAddress );
addresses.remove( personAddress );
personAddress.setPerson( null );
personAddress.setAddress( null );
}
}
@Entity(name = "PersonAddress")
public static class PersonAddress implements Serializable {
@Id
@ManyToOne
private Person person;
@Id
@ManyToOne
private Address address;
// ...
}
@Entity(name = "Address")
public static class Address implements Serializable {
@Id
@GeneratedValue
private Long id;
private String street;
@Column(name = "`number`")
private String number;
private String postalCode;
@OneToMany(
mappedBy = "address",
cascade = CascadeType.ALL,
orphanRemoval = true
)
private List<PersonAddress> owners = new ArrayList<>();
// ....
}
我的意思是,如果我要做一个类图,它看起来不会和这些实体完全一样,因为你必须为Hibernate完成一些条件,这样它才能用ORM将它们映射到表中。例如,在一个假设的类图中 Person
会有一个名单 Address
,而不是一个清单 PersonAddress
正如Hibernate在这种情况下建议的那样(为了映射性能)。
我的问题是,我是否应该将 Person
模型分为两个独立的实体,一个用于业务逻辑层(服务),一个用于数据访问层(存储库)。我个人认为这不是一个问题,因为Hibernate帮助我忽略了所有的表创建,但也许这不是一个好的做法,我应该把它分成两个不同的实体。
在一般情况下,我使用一个API-模型和一个实体-模型.api模型是用来交换服务之间的数据和实体对象是用来持久化数据。这样可以让你的架构更加灵活。如果你的busineslogic中的某些东西发生了变化,实体不会自动受到影响。另外,有时你从客户端获取数据,不想暴露整个数据库对象。所以你可以只提供你需要的字段,其余的在实体对象中完成。这也是静态代码分析sonaqube所推荐的。
你所指的是持久化模型和业务域模型的分裂,这是很常见的。人们经常把这种方法称为DTO方法.这种方法有很多好处,如果你实现得好,几乎没有缺点。
高效地实现它,可以用 Blaze-持久性实体-视图 JPAHibernate之上的一个库,它将为你透明地处理所有的获取。请看一下 春季数据整合 它允许你快速上手,或者通过一个 原型 来感受一下好处。