2017-05-08 2 views
1

私のプロジェクトでは、私はUserエンティティとUserRoleエンティティを持っています。 私のデータベース設計によれば、ユーザーは複数の役割を果たし、役割は複数のユーザーに関連付けることができます。私のシステムで持っているユーザーの役割は、USERとADMINです。User、UserRoleのデータベース設計 - 多対多の関係

ユーザーの役割がテーブルに格納される必要があり、ユーザーが関連するテーブルに保持されているときに参照する必要があります。

しかし、私が実装したコードによれば、ユーザーをデータベースに挿入するたびにレコードがユーザーロールテーブルに挿入されることがあります。私が必要とするのは、UserテーブルとJoinテーブルにデータを挿入することです。

これは私のエンティティです。

ユーザー:

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

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id", nullable = false, updatable= false) 
    private Long id; 

    @Column(name = "email", nullable = false, unique = true) 
    private String email; 

    @Column(name = "first_name", nullable = false) 
    private String firstName; 

    @Column(name = "last_name", nullable = false) 
    private String lastName; 

    @Column(name = "password_hash", nullable = false) 
    private String passwordHash; 

    @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @JoinTable(name = "user_with_role", 
      joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")}, 
      inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")}) 
    private List<UserRole> roles; 

} 

のUserRole:

@Entity 
@Table(name = "userrole") 
public class UserRole { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id", nullable = false, updatable= false) 
    private long id; 

    @Column(name = "role_name") 
    @NotNull 
    @Enumerated(EnumType.STRING) 
    private Role roleName; 

    @ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY) 
    private List<User> users; 
} 

これは、私は、データベースにユーザーを保持する方法です。

List<UserRole> roles = new ArrayList<>(); 

UserRole ur_user = new UserRole(); 
ur_user.setRoleName(Role.USER); 

UserRole ur_admin = new UserRole(); 
ur_user.setRoleName(Role.ADMIN); 

roles.add(ur_user); 
roles.add(ur_admin); 

newUser.setRoles(roles); 
entityManager.persist(newUser); 

entityManager.flush(); 

このメカニズムは、関連エンティティを親エンティティとともにデータベースに入力する必要がある場合に適しています。 (例:従業員の連絡先)

私の状況では、ユーザーが永続化されたときにUserRoleテーブルに挿入しないようにコードを記述する方法を理解できません。

どのように私の状況でコードを書くべきですか? さらに、UserエンティティでCascadeTypeを使用する必要があることを知りたいと思います。私はCascadeType.ALLを入れましたが、それは文脈に従ってその場所で最高のタイプではないことを知っています。

答えて

1

よく、@ManyToManyについては、CascadeType.REMOVEについては、私はCascadeType.PERSIST, CascadeType.MERGEと定義しています。

これで、残りのマッピングを正常な状態に保つことができます。 ロールを保存しないようにするには、最初にそれらを照会して、手動で作成する必要はありません。永続性については、新しい管理されていないエンティティであり、コミット時にそれらを永続化しようとします。

次の例では、既存のUserRole'sを利用して、そののみUserを(既存の依存関係を使用して)永続化されるおかげ:

UserRole ur_user = entityManager.getRoleByType(Role.USER); 
UserRole ur_admin = entityManager.getRoleByType(Role.ADMIN); 

roles.add(ur_user); 
roles.add(ur_admin); 

newUser.setRoles(roles); 
entityManager.persist(newUser);