首页 > 解决方案 > Spring数据中的实体继承

问题描述

我正在开发一个简单的应用程序来学习如何使用 spring boot/hibernate,并且我正在使用带有 Role/Users 系统的 spring security,所以我有一个名为 User 的实体,另一个名为 Roles 的实体。

对于我的应用程序,我有两种类型的用户:

  1. 具有属性的管理员( id ,用户名,密码)

  2. 具有属性的客户端(id、用户名、密码、电子邮件、电话号码)

这就是为什么我决定在 Spring Data 中使用继承的概念来创建具有属性(id、用户名、密码)的实体用户和继承实体用户并具有其他属性(id、电子邮件、电话号码)的客户端实体。

在这个应用程序中,客户端可以添加/删除/..我的数据库 Mysql 中存在的一些产品,所以我想在实体客户端和实体产品之间实现(一对多/多对一)的映射。

现在我应该如何实现这个(ORM SIDE),我的意思是我应该在实体客户端和产品之间或用户和产品之间进行映射?

如果还有其他更好的解决方案,我将非常感激:)。

编辑 :

     @Entity
@Data
@AllArgsConstructor @NoArgsConstructor
public class User implements Serializable {

    @Id @GeneratedValue
    private Long id;
    @Column(unique = true)
    private String username;
    private String password;
    private String prenom;
    private String nom;
    private Long Tel;
    private String CIN;
    private String Email ;
    @ManyToMany(fetch = FetchType.EAGER)
    private Collection<AppRole> roles = new ArrayList<>();

    @ManyToOne
    @JoinColumn(name="client_id")
    private User Client;


    @ManyToOne
    @JoinColumn(name = "manager_id")
    private User Manager;


           }

标签: spring-bootormspring-dataspring-data-jpamapping

解决方案


您应该有一个表“用户”和 2 个角色“管理员”和“客户”。我建议两种用户类型都应具有相同的详细信息,包括电子邮件地址和电话号码。因此,当用户登录时,您可以从 userdetails 服务加载用户角色/授予的权限。

编辑: 您的用户表应该看起来像

id , username , password , email , phoneNumber , added_by_id

added_by_id 是一个自连接和对 user.id 列的引用。

因此,在您的实体类中,您将执行以下操作。

...
@ManyToOne
@JoinColumn(name = "added_by_id")
protected User addedBy;

推荐阅读