Jpa 为某些用户定义自定义字段
对于我的应用程序,我需要定义以下类型的配置文件:Jpa 为某些用户定义自定义字段,jpa,user-roles,Jpa,User Roles,对于我的应用程序,我需要定义以下类型的配置文件: 推销员 顾客 管理员 用户可以拥有一个或所有这些配置文件。这就是为什么我没有选择继承设计,我更喜欢选择角色策略,这样一个用户就可以有很多角色。例如,用户可以具有销售人员和客户角色。问题是每个角色都有一些特定的信息,例如销售人员必须指定他的送货地址 下面是一个使用spring security/JPA的my实现: 用户模型 @Entity @Table(name = "USER") public class User implements Us
- 推销员
- 顾客
- 管理员
@Entity
@Table(name = "USER")
public class User implements UserDetails{
@Id
@Column(name = "USER_ID")
private Long id;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name="USER_ROLE",
joinColumns={@JoinColumn(name="USER_ID", referencedColumnName="USER_ID")},
inverseJoinColumns={@JoinColumn(name="USER_ROLE_ID", referencedColumnName="ROLE_ID")})
private Set<Role> roles = new HashSet<Role>();
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Set<Role> getRoles() {
return roles;
}
public void setRoles(Set<Role> roles) {
this.roles = roles;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
authorities.addAll(roles);
return authorities;
}
}
我不能为每个角色定义特定字段,因为类角色是泛型的,我不想在一个角色中混合所有角色的字段,我更喜欢在每个角色中封装每个特定字段。我不想将所有角色的所有字段混合存储在数据库中的一个表中,因为每个角色都有其特定的约束。
我该怎么做?我找到了一个平均解决方案,我可以为每种配置文件使用组合
@Entity
@Table(name = "USER")
public class User implements UserDetails{
@Id
@Column(name = "USER_ID")
private Long id;
@OneToMany
private SalesmanProfile salesmanProfile;
@OneToMany
private CustomerProfile customerProfile;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
@Entity
@Table(name = "SALESMAN_PROFILE")
public class SalesmanProfile{
@Id
@Column(name = "SALESMAN_PROFILE_ID")
private Long id;
@ManyToOne
@JoinColumn(name = "USER_ID", nullable = false)
private User user;
private SpecificsFields.....
}
同样适用于CustomerProfile
如果我想知道用户是否是销售员,我可以检查用户的销售员档案是否不为空。。。
你觉得怎么样
@Entity
@Table(name = "USER")
public class User implements UserDetails{
@Id
@Column(name = "USER_ID")
private Long id;
@OneToMany
private SalesmanProfile salesmanProfile;
@OneToMany
private CustomerProfile customerProfile;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
@Entity
@Table(name = "SALESMAN_PROFILE")
public class SalesmanProfile{
@Id
@Column(name = "SALESMAN_PROFILE_ID")
private Long id;
@ManyToOne
@JoinColumn(name = "USER_ID", nullable = false)
private User user;
private SpecificsFields.....
}