0

私のアプリケーションでは、これらの種類のプロファイルを定義する必要があります:

  • セールスマン
  • お客様
  • 管理者

ユーザーは、これらのプロファイルの 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 つのテーブルに混在させて保存したくありません。どうすればいいですか?

4

1 に答える 1

0

平均的な解決策を見つけました。プロファイルの種類ごとに構成を使用できます。

    @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 についても同様です...

ユーザーがセールスマンであるかどうかを知りたい場合は、ユーザーのセールスマン プロファイルが null でないかどうかを確認できます...どう思いますか?

于 2013-11-05T08:15:54.223 に答える