设计Spring Boot RESTful API的各层及其实体映射。

问题描述 投票:0回答:1

我一直在思考我的服务器的架构,因为我正在使用Spring Boot从头开始开发我的第一个RESTful API.我正在使用Hibernate,并且我使用HibernateJPA注解创建了几个实体和它的关系,然而,我不确定我是否应该使用这些实体作为业务模型,因为它们是 "肮脏 "的,有Hibernate推荐的额外字段。

这是我暂定的REST API分层架构。

这是直接从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帮助我忽略了所有的表创建,但也许这不是一个好的做法,我应该把它分成两个不同的实体。

java spring hibernate spring-boot rest
1个回答
0
投票

在一般情况下,我使用一个API-模型和一个实体-模型.api模型是用来交换服务之间的数据和实体对象是用来持久化数据。这样可以让你的架构更加灵活。如果你的busineslogic中的某些东西发生了变化,实体不会自动受到影响。另外,有时你从客户端获取数据,不想暴露整个数据库对象。所以你可以只提供你需要的字段,其余的在实体对象中完成。这也是静态代码分析sonaqube所推荐的。


0
投票

你所指的是持久化模型和业务域模型的分裂,这是很常见的。人们经常把这种方法称为DTO方法.这种方法有很多好处,如果你实现得好,几乎没有缺点。

高效地实现它,可以用 Blaze-持久性实体-视图 JPAHibernate之上的一个库,它将为你透明地处理所有的获取。请看一下 春季数据整合 它允许你快速上手,或者通过一个 原型 来感受一下好处。

© www.soinside.com 2019 - 2024. All rights reserved.