数据持久化模式和使用 Springboot/hibernate 处理关系

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

我正在尝试使用 springboot 来解决持久性和数据检索问题。 假设我有一个 User(email,password) 实体,它有以下关系
一个User可以有多个权限(或特权,用于授权)
一个User可以有一个UserProfile(用户名,生日...等)来存储关于用户的不同信息

典型的 springboot CRUD 示例建议为每个实体创建实体和存储库,并在实体上使用 @OneToOne@OneToMany...等关系,但这种方法不会混合 RepositoryAggregate 模式,这会导致代码很难维护?

在实际的 springboot 应用程序中使用哪些最佳实践/模式以简单且可维护的方式管理持久性?

spring-boot hibernate design-patterns relationship repository-pattern
2个回答
0
投票

通常在 Spring Boot 中,您为每个实体创建存储库,实体通过 JPA 注释连接。这创建了相当干净的架构——你从给定的存储库中获取数据以获得具体的实体。

当然,那些实体可以有关系。您可以使用 join 立即获取它们,您可以使用 FetchType.LAZY 以惰性方式获取它们,您可以组合调用几个存储库来获取所需的数据。然后简单的实体可以成为这样的聚合体。


0
投票

这是您可以创建的示例设计;

第一个

User
实体;

@Entity
@Data
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, unique = true)
    private String email;

    @Column(nullable = false)
    private String password;

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private Set<UserProfile> userProfiles = new HashSet<>();

    @ManyToMany
    @JoinTable(name = "user_authority",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "authority_id"))
    private Set<Authority> authorities = new HashSet<>();

}

UserProfile
实体;

@Entity
@Data
public class UserProfile {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String username;

    @Column(nullable = false)
    private LocalDate birthdate;

    @ManyToOne
    @JoinColumn(name = "user_id")
    private User user;
}

最后一个实体是

Authority
;

@Entity
@Data
public class Authority {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, unique = true)
    private String name;

    @ManyToMany(mappedBy = "authorities")
    private Set<User> users = new HashSet<>();
}

然后您可以从这些实体创建您的存储库类和服务层。

OneToMany
User
之间的关系,以
UserProfile
中的用户字段作为外键以及
UserProfile
ManyToMany
之间的
User
关系,连接表名为
Authority
到管理关系。
user_authority
CascadeType.ALL
的配置文件字段上,以确保删除用户时,所有关联的
User
也将被删除。
    

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