当前位置: 首页 > 知识库问答 >
问题:

如何在spring boot中表示和查询三实体关系?

燕昊东
2023-03-14

我正在开发一个商城系统,用户可以在其中拥有一个或多个商店。如果您创建一个商店,您将为该商店扮演ADMIN角色,否则:您创建一个帐户,然后该商店的ADMIN将您分配给一个商店作为经理。用户可以拥有一个他们是管理员的商店,但也可以成为该商店所有者分配给您的不同商店的经理。因此,我提出了三个实体:用户、角色和商店。

用户实体

 @Entity
@Table(name = "us_users")

public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@NotBlank
private String uuid;
@Email
private String us_email;
//other fields
//getters/setters
} 

角色实体。

@Entity
@Table(name = "ro_roles")
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String rn_role_name;
//setter getter
}

商店实体。

@Entity
@Table(name = "sh_shops")
public class Shop {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    @NotBlank(message = "Shop name can not be left blank")
    private String sh_name;

    @NotBlank(message = "please provide shop icon")
    private String sh_icon;

    @NotBlank(message = "please fill the shop description")
    private String sh_description;
//other fields.. getters and setters
}

我需要这三个实体之间的关系:类似于一个包含userId、shopId和RoleId的表,用户可以在其中

  1. 登录系统,系统就可以确定该用户下的角色以及哪个商店。(使用Spring Security授权机构)
  2. 向用户显示其帐户下的店铺,用户只能以正确的角色操作店铺

请协助如何建模此用例。谢谢

共有1个答案

谭云瀚
2023-03-14

首先,你真的需要角色的灵活性吗?也许拥有一个简单枚举的角色就足够了,至少如果您不打算在运行时创建新角色的话。这将简化数据模型。

其次,这听起来像是用户实体的映射关系:

@Entity
@Table(name = "us_users")
public class User {

    @ManyToMany
    @MapKeyJoinColumn(name = "shop_id")
    @JoinTable(name = "user_shop_role", 
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Map<Shop, Role> shopRoles = new HashMap<>();

}

在这里,您使用user_shop_role表创建一个三向关系,该表包含字段user_idshop_idrole_id,这意味着您期望的。

然后,为用户添加一个商店角色只需将一个关键价值关系添加到此地图:

user.getShopRoles().put(shop, role);

显示店铺列表只需遍历地图条目,并显示具有相应角色(值)的店铺(键)。

由于您使用Shop作为键,因此需要确保Shop实体正确实现equalshashCode方法(基于其id)。

 类似资料:
  • null 这似乎意味着我不像使用简单的“From customer”查询那样获取customer实体的实例。如果是这种情况,如何返回客户实体?如果没有,那我做错了什么?

  • 样本子句 sample_clause允许您指示数据库从表中的随机数据样本中进行选择,而不是从整个表中进行选择。 我想使用QueryDSL运行下面的查询 样本子句 sample_clause允许您指示数据库从表中的随机数据样本中进行选择,而不是从整个表中进行选择。 从测试t样本(80)中选择,其中t.test_id=01,t.test _ suite _ id = 02 其中条件是动态的,我使用qu

  • 我在做一个费用追踪系统,但出了点问题。 我在数据库中有3个表。 表1(项目) 表2(类别) 表3(费用) tblProjects与tblCategory的关系为1:1,tblExpenses与tblProjects的关系也为1:1。 现在,我正在尝试得到每个类别的总和。例如,我想知道旅行、运动等的总花费是多少。 我尝试使用下面的查询,但它返回给我错误的数据

  • 我有一个密码查询,它应该返回节点和边,这样我就可以在web应用程序中呈现我的图形的表示。我使用Neo4joOperations中的方法运行它。 之前,我使用的是spring数据neo4j 3.3。1使用嵌入式数据库,此查询在返回具有开始节点和结束节点的关系代理方面做得很好。我已经升级到SpringDataNeo4J4.0。0并切换到使用远程服务器,现在它返回的LinkedHashMaps非常空。

  • 问题内容: 我非常热衷于在CSS中使用媒体查询,但是我对如何使用它感到困惑。我有立场 我的查询要求是 如果屏幕宽度是100到480,那么会出现不同的样式, 如果屏幕宽度从481到600,那么会出现不同的样式, 如果屏幕宽度为601到800,那么会出现不同的样式, 如果屏幕宽度为801,则默认CSS应该有效。 问题答案: