【问题标题】:Stoping spring Jpa + hibernate from rewriting values in joined database停止 spring Jpa + hibernate 重写连接数据库中的值
【发布时间】:2020-02-11 16:37:27
【问题描述】:

我开始学习 Hibernate 和 Spring JPA 并尝试连接两个表但无法使其正常工作。 这是我的课程:


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

    @OneToMany( fetch = FetchType.EAGER, cascade = CascadeType.ALL)
            @JoinColumn(name="username", referencedColumnName="username")
    List<UserRole> userRoles;
    private String email;
    private String name;
    private String password;
    private String grp;
    @Id
    private String username;

    public User() {
        userRoles=new ArrayList<>();
        userRoles.add(new UserRole("default"));
    }
@Entity
@Table(name = "roles")
public class UserRole  {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name = "role_name")
    String roleName;

    @Override
    public String toString() {
        return  roleName;
    }

    public UserRole(String role) {
        roleName = role;
    }

我遇到的问题是当我使用 JpaRepository 的保存方法来更新用户时,角色值在角色表中重复。 例如,如果我有一个具有 ADMIN ROLE 的用户并使用 save 首先将用户添加到表中,然后更新他的电子邮件,我将得到两个具有不同 ID 的相同角色字段。(如果我将可空标记设置为 false) 否则,它只会给我一个新字段,其中 null 作为用户名、ADMIN 角色和新 ID。 我知道它可能连接到 generationType.IDENTITY。但是,如果我将其设为 AUTO,则会得到 Table 'project2testing.hibernate_sequence' 异常。 你能帮我弄清楚我做错了什么吗? 谢谢!

【问题讨论】:

    标签: hibernate spring-data-jpa


    【解决方案1】:

    您可能想要的是外部参照表和ManyToMany,我在这里看不到。您现在所说的是用户和许多角色之间存在单一关系。换句话说,角色不可重用。它们属于一个用户,每次将用户分配给角色时,即使同名角色已经存在,也会创建一个新角色。

    相反,ManyToMany 更有意义。传统上,角色对于用户来说并不是唯一的事物,许多用户可能拥有相同的角色。

    实现这一目标的一种方法是:

    @ManyToMany(targetEntity = UserRole.class, fetch = FetchType.EAGER)
    @JoinColumn(name="user_role_xref", 
        joinColumns = @JoinColumn(name = "username", referencedColumnName = "username"),
        inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
    Set<UserRole> userRoles;
    

    这将创建一个 user_role_xref 表,其中包含两列:usernamerole_id,分别引用 User.usernameUserRole.id。请注意,这将需要独立于用户管理UserRole,这在这种情况下似乎更可取。一个角色当前没有分配给用户并不意味着它应该被删除。

    【讨论】:

    • 非常感谢您的回答。祝你一切顺利。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 2011-03-29
    • 2016-10-24
    • 2012-01-31
    • 1970-01-01
    相关资源
    最近更新 更多