私のアプリケーションでは、これらの種類のプロファイルを定義する必要があります:
- セールスマン
- お客様
- 管理者
ユーザーは、これらのプロファイルの 1 つまたはすべてを持つことができます。私が継承設計を選択しなかったのはそのためです。ユーザーが多くの役割を持つことができるように、役割戦略を選択することを好みました。たとえば、ユーザーはセールスマンと顧客の役割を持つことができます。問題は、役割ごとにいくつかの詳細情報があることです。たとえば、セールスマンは配達先住所を指定する必要があります...
spring security/JPA を使用した私の実装は次のとおりです。
ユーザーモデル
@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 = "ROLE")
public class Role implements GrantedAuthority {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ROLE_ID")
private Long idRole;
@Column(name = "TYPE_ROLE")
private String typeRole;
public Long getIdRole() {
return this.idRole;
}
public void setIdRole(Long idRole) {
this.idRole = idRole;
}
public String getTypeRole() {
return this.typeRole;
}
public void setTypeRole(String typeRole) {
this.typeRole = typeRole;
}
@Override
public String getAuthority() {
return typeRole;
}
}
クラス Role は一般的であるため、各役割に特定のフィールドを定義することはできません。すべての役割のフィールドを 1 つの役割に混在させたくありません。各役割の特定のフィールドをカプセル化することを好みます。各ロールには固有の制約があるため、すべてのロールのすべてのフィールドをデータベースの 1 つのテーブルに混在させて保存したくありません。どうすればいいですか?