【发布时间】:2020-08-09 10:14:12
【问题描述】:
自从我使用 Spring Boot 从头开始开发我的第一个 RESTful API 以来,我一直在思考我的服务器的架构。 我正在使用 Hibernate,并使用 Hibernate/JPA 注释创建了几个实体及其关系,但是,我不确定是否应该将这些实体用作业务模型,因为它们对于 Hibernate 推荐的额外字段是“脏的”。
This is my tentative REST API layered architecture
这是一个直接取自 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 列表,而不是 Hibernate 在这种情况下建议的 PersonAddress 列表(用于映射性能)。
我的问题是我是否应该将Person 模型分成两个独立的实体,一个用于业务逻辑层(服务),一个用于数据访问层(存储库)。就个人而言,我认为这不是问题,因为 Hibernate 帮助我忽略了所有的表创建,但也许这不是一个好习惯,我应该将它分成两个不同的实体。
【问题讨论】:
标签: java spring hibernate spring-boot rest