首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在spring引导中为三个不同角色设计类?

如何在spring引导中为三个不同角色设计类?
EN

Stack Overflow用户
提问于 2021-11-05 09:52:25
回答 1查看 152关注 0票数 1

我正在开发一个涉及分发管理的spring引导应用程序。有3种类型的用户谁将与系统互动-管理,经销商和零售商。

company.

  • Retailer
  1. 只能有一个公司的管理员,
  2. 在一个特定的城市中只能有一个分销商,可以与特定城市的不同公司的分销商联系在一起。

现在,为了这些东西。我已经创建了5个类-用户、角色、管理员、分销商和零售商。请任何人建议我,在设计所需的类时,我应该如何处理这个问题。我最初尝试过,但我仍然认为这个类的结构本身是复杂的。有什么东西我遗漏了吗?还是有什么设计模式可以使事情变得更不稳定?

代码语言:javascript
复制
@Entity
@Table(name = "tbl_User")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "user_id")
    private Long userId;
    
    @NotNull(message = "first Name cannot be null")
    @Column(name = "first_Name")
    private String firstName;
    
    @NotNull(message = "last Name cannot be null")
    @Column(name = "last_Name")
    private String lastName;
    
    @ManyToOne()
    @JoinColumn(name = "role_Id")
    private Role role;
    
    @NotNull
    @Size(min = 10, max = 10, message = "Contact must be of 10 characters")
    @Column(name = "contact")
    private String contact;
    
    @NotNull
    @Email(message = "Email should be valid")
    @Column(name = "email", unique = true)
    private String email;
    
    @NotNull
    @Size(min = 10, max = 255, 
    message = "Local address must be between 10 and 255 characters")
    @Column(name = "local_Address")
    private String localAddress;
    
    @ManyToOne()
    @JoinColumn(name = "city_Id")
    private City city;
    
    @NotNull
    @Column(name = "user_Name")
    private String userName;
    
    @NotNull
    @Column(name = "password")
    private String password;
    
    @Column(name = "registered_On")
    private LocalDateTime registeredOn;
    
    @Column(name = "updated_On")
    private LocalDateTime updatedOn;
    
    @Column(name = "approved_By")
    private Long approvedBy;
    
    @NotNull
    @Size(min = 1, max = 1, 
    message = "Approval status must be of 1 character.")
    @Column(name = "approval_Status")
    private String approvalStatus;

    @NotNull
    @Column(name = "active_Status")
    private boolean activeStatus;
    
    @Transient 
    private Company company;
}
代码语言:javascript
复制
@Entity
@Table(name = "tbl_Administrator")
public class Admin {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int adminId;
    
    @OneToOne()
    @JoinColumn(name = "user_Id")
    private User user;
    
    @OneToOne()
    @JoinColumn(name = "company_Id")
    private Company company;    
}
代码语言:javascript
复制
@Entity
@Table(name = "tbl_Distributor")
public class Distributor {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long distributorId;
    
    @OneToOne()
    @JoinColumn(name = "user_Id")
    private User user;
    
    @ManyToOne()
    @JoinColumn(name = "company_Id")
    private Company company;
}
代码语言:javascript
复制
@Entity
@Table(name = "tbl_Retailer")
public class Retailer {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long retailerId;

    @OneToOne()
    @JoinColumn(name = "user_Id")
    private User user;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-05 22:25:23

我将使用@MappedSuperclass,而不是创建User和实体本身。基本上,AdminDistributorRetailer将扩展这个映射的超类。为每个表创建了一个单独的表,但没有为超类(User)本身创建任何表。

代码语言:javascript
复制
@MappedSuperclass
public class User {

   // Your properties
   
}
代码语言:javascript
复制
@Entity
@Table(name = "tbl_Administrator")
public class Admin extends User {

    @OneToOne()
    @JoinColumn(name = "company_Id")
    private Company company;  
     
}
代码语言:javascript
复制
@Entity
@Table(name = "tbl_Distributor")
public class Distributor extends User {
    
    @ManyToOne()
    @JoinColumn(name = "company_Id")
    private Company company;
    
}
代码语言:javascript
复制
@Entity
@Table(name = "tbl_Retailer")
public class Retailer extends User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Long retailerId;
    
}

您还有其他可能性(请参阅https://medium.com/analytics-vidhya/jpa-hibernate-entity-inheritance-1f6aa7ea2eea中的更多内容),如下所示:

用于超类和子类的所有entities

  • Separate表的
  • 单表。超类中定义的属性不包含在每个类的subclass.
  • Table表中,这类似于映射的超类,其区别在于超类也有相应的表。

不过,我还是会按照描述的那样使用映射的Superclass 1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69851361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档