停止弹簧Jpa和x2B;hibernate防止在联接数据库中重写值

停止弹簧Jpa和x2B;hibernate防止在联接数据库中重写值,hibernate,spring-data-jpa,Hibernate,Spring Data Jpa,我开始学习Hibernate和SpringJPA,并尝试连接两个表,但无法使其正常工作。 以下是我的课程: @Entity @Table(name = "users") public class User { @OneToMany( fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinColumn(name="username", referencedColumnName="username")

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


@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"));
    }
我遇到的问题是,当我使用JpaRepository的save方法更新用户时,角色表中的角色值会重复。 例如,如果我有一个具有管理员角色的用户,并使用save首先将该用户添加到表中,然后更新他的电子邮件,我将得到两个具有不同ID的相同角色字段。(如果我将nullable标记设为false) 否则,它只会给我一个新字段,用户名、管理员角色和新ID为null。 我知道它可能与generationType.IDENTITY有关。但如果我将其设置为自动,则会出现表“project2testing.hibernate\u sequence”异常。 你能帮我找出我做错了什么吗。
谢谢

您可能需要的是一个外部参照表和
manytomy
,我在这里没有看到。您现在要说的是,一个用户和多个角色之间只有一种关系。换句话说,角色是不可重用的。它们属于某个用户,每次将用户分配给某个角色时,即使已存在具有该名称的角色,也会创建一个新角色

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

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

@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;
@ManyToMany(targetEntity=UserRole.class,fetch=FetchType.EAGER)
@JoinColumn(name=“user\u role\u xref”,
joinColumns=@JoinColumn(name=“username”,referencedColumnName=“username”),
inverseJoinColumns=@JoinColumn(name=“role\u id”,referencedColumnName=“id”))
设置用户角色;

这将创建一个
user\u role\u xref
表,该表将包含两列:
username
role\u id
,分别引用
user.username
UserRole.id
。请注意,这将需要独立于用户管理
UserRole
,这在本场景中似乎更可取。仅仅因为角色当前未分配给用户并不意味着它应该被删除。

您可能需要的是一个外部参照表和
manytomy
,我在这里没有看到。您现在要说的是,一个用户和多个角色之间只有一种关系。换句话说,角色是不可重用的。它们属于某个用户,每次将用户分配给某个角色时,即使已存在具有该名称的角色,也会创建一个新角色

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

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

@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;
@ManyToMany(targetEntity=UserRole.class,fetch=FetchType.EAGER)
@JoinColumn(name=“user\u role\u xref”,
joinColumns=@JoinColumn(name=“username”,referencedColumnName=“username”),
inverseJoinColumns=@JoinColumn(name=“role\u id”,referencedColumnName=“id”))
设置用户角色;

这将创建一个
user\u role\u xref
表,该表将包含两列:
username
role\u id
,分别引用
user.username
UserRole.id
。请注意,这将需要独立于用户管理
UserRole
,这在本场景中似乎更可取。角色当前未分配给用户并不意味着应该删除该角色。

非常感谢您的回答。祝你一切顺利。非常感谢你的回答。祝你一切顺利。