我正在尝试使用 springboot 来解决持久性和数据检索问题。
假设我有一个 User(email,password) 实体,它有以下关系
一个User可以有多个权限(或特权,用于授权)
一个User可以有一个UserProfile(用户名,生日...等)来存储关于用户的不同信息
典型的 springboot CRUD 示例建议为每个实体创建实体和存储库,并在实体上使用 @OneToOne、@OneToMany...等关系,但这种方法不会混合 Repository和 Aggregate 模式,这会导致代码很难维护?
在实际的 springboot 应用程序中使用哪些最佳实践/模式以简单且可维护的方式管理持久性?
通常在 Spring Boot 中,您为每个实体创建存储库,实体通过 JPA 注释连接。这创建了相当干净的架构——你从给定的存储库中获取数据以获得具体的实体。
当然,那些实体可以有关系。您可以使用 join 立即获取它们,您可以使用 FetchType.LAZY 以惰性方式获取它们,您可以组合调用几个存储库来获取所需的数据。然后简单的实体可以成为这样的聚合体。
这是您可以创建的示例设计;
第一个
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
也将被删除。