簡體   English   中英

雙向JPA OneToMany映射使人感覺異常

[英]Strange feeling with my bi-directional JPA OneToMany mapping

我有兩個實體, UserRole ,它們應在雙向的Role與多個User

用戶類別:

@Entity
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long userId;
    ...
    @ManyToOne
    private Role role;
    ...
    public void setRole(Role role) {
        this.role = role;
        if (!role.getUsers().contains(this)) {
            role.getUsers().add(this);
        }
    }
}

角色類:

@Entity
public class Role implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long roleId;

    private String roleName;

    @OneToMany(mappedBy = "role")
    private List<User> users = new ArrayList<>();
    ...
    public void addUser(User user) {
        users.add(user);
        if (user.getRole() != this) {
            user.setRole(this);
        }
    }

最后,我嘗試通過以下方式在我的signUp方法中設置這些實體:

    try {
        em.persist(newUser);
    } catch (Exception e) {
        throw new Exception("Could not persist user.");
    }

    Role role = new Role();
    role.setRoleName("user");
    role.addUser(newUser);
    try {
        em.persist(role);
    } catch (Exception e) {
        throw new Exception("Could not persist role.");
    }

到目前為止,一切都很好,並且沒有異常,但是不知何故,我感覺有些多余。 我想知道如果我在RoleList<User>中始終只存儲一個用戶,會發生什么情況? 或者我是偏執狂,並且此代碼很好?

似乎您正在為每個新用戶創建一個名稱為“ user”的新角色,而不是重用當前的“ user”角色。 每個“用戶”角色只有一個用戶。

您應該嘗試按名稱查找角色,而不是總是創建新的角色。

    Role role = findRoleByName("user"); 
    if (role == null) {
        role = new Role();
        role.setRoleName("user");
    }

    role.addUser(newUser);
    try {
        em.persist(role);
    } catch (Exception e) {
        throw new Exception("Could not persist role.");
    }

User可以有多個角色,一個Role可以屬於多個用戶。 您需要在UserRole之間具有@ManyToMany關聯。 Role類似於參考值,因此不應存儲關聯用戶。

@Entity
@Table
public class User {

    @Id
    @GeneratedValue
    private Long pid;

    @ManyToMany(fetch = FetchType.LAZY)
    private List<Role> roles;

}

@Entity
@Table
public class Role {

    @Id
    private Long pid;

    @Column
    private String name;

} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM