如何在 spring 引导中表示和查询三实体关系?
How to represent and query from a three entity relationship in spring boot?
我正在开发一个商城系统,用户可以在其中拥有一个或多个商店。如果您创建了一家商店,您将拥有该商店的 ADMIN 角色,否则:您创建了一个帐户,然后您被分配了一家商店作为 MANAGER通过那家商店的 ADMIN。一个用户可以有一个 shop,他们是 admin,但也可以是 manager那家商店的店主分配给您的不同 商店。因此,我提出了三个实体:用户、角色和商店。
用户实体
@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
}
我需要这三个实体之间的关系:类似于 table 具有 userId、shopId、RoleId,用户可以在其中
- 登录系统,系统可以判断该用户下的角色和店铺。(使用Spring security GrantedAuthorities)
- 显示用户店铺在他的账号下,用户只能操作正确角色的店铺。
请协助解决如何对此用例建模的问题。谢谢
首先,您真的需要角色的灵活性吗?也许拥有一个简单枚举的角色就足够了,至少如果您不打算在运行时创建新角色的话。这将简化数据模型。
其次,这听起来像是用户实体的映射关系:
@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_id
、shop_id
和 role_id
的 user_shop_role
table 创建三向关系,这意味着您d期待。
那么给用户添加一个shop角色就是给这个map添加一个key-value关系:
user.getShopRoles().put(shop, role);
显示商店列表只是遍历地图条目并显示具有相应角色(值)的商店(键)。
由于您使用 Shop
作为键,您需要确保 Shop
实体正确实现了 equals
和 hashCode
方法(基于其 id
).
我正在开发一个商城系统,用户可以在其中拥有一个或多个商店。如果您创建了一家商店,您将拥有该商店的 ADMIN 角色,否则:您创建了一个帐户,然后您被分配了一家商店作为 MANAGER通过那家商店的 ADMIN。一个用户可以有一个 shop,他们是 admin,但也可以是 manager那家商店的店主分配给您的不同 商店。因此,我提出了三个实体:用户、角色和商店。
用户实体
@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
}
我需要这三个实体之间的关系:类似于 table 具有 userId、shopId、RoleId,用户可以在其中
- 登录系统,系统可以判断该用户下的角色和店铺。(使用Spring security GrantedAuthorities)
- 显示用户店铺在他的账号下,用户只能操作正确角色的店铺。
请协助解决如何对此用例建模的问题。谢谢
首先,您真的需要角色的灵活性吗?也许拥有一个简单枚举的角色就足够了,至少如果您不打算在运行时创建新角色的话。这将简化数据模型。
其次,这听起来像是用户实体的映射关系:
@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_id
、shop_id
和 role_id
的 user_shop_role
table 创建三向关系,这意味着您d期待。
那么给用户添加一个shop角色就是给这个map添加一个key-value关系:
user.getShopRoles().put(shop, role);
显示商店列表只是遍历地图条目并显示具有相应角色(值)的商店(键)。
由于您使用 Shop
作为键,您需要确保 Shop
实体正确实现了 equals
和 hashCode
方法(基于其 id
).