Hibernate错误(“对象引用未保存的瞬态实例”或“重复条目”

时间:2017-05-30 00:43:49

标签: java spring hibernate spring-mvc

我的代码存在很大问题:

这是我的UserAccount类: https://github.com/Bodyash/pizzaria/blob/master/src/main/java/com/bodyash/pizzaria/bean/UserAccount.java

这是我的UserAccountRole类: https://github.com/Bodyash/pizzaria/blob/master/src/main/java/com/bodyash/pizzaria/bean/UserAccountRole.java

我正在使用@ManyToMany关系,因为用户可以拥有多个角色,例如:

用户名:testuser

角色:ADMIN,DBA

但是当我创建一个新的UserAccount.class并试图用角色User持有这个Entity时 - 我有错误:

Hibernate: 
insert 
into
    account
    (PASSWORD, SSO_ID) 
values
    (?, ?)


Hibernate: 
insert 
into
    account_role
    (TYPE) 
values
    (?)

ERROR: Duplicate entry 'USER' for key 'UK_p90gi6g6phk4nka444jkxi9ik'

这都是因为我的表(account_role)填充了以下类型: USER, DBA, ADMIN并且我不需要将此角色写入TABLE AGAIN,但Hibernate ORM尝试这样做。我只需要将一个新用户写入表并使用表account_account_role来了解哪些角色拥有此用户。 对不起我的英语,我只需要一些帮助。

更新:

完整堆栈异常跟踪: pastebin.c o m / k061xxyV(对不起,我不能发布2个以上的链接)

2 个答案:

答案 0 :(得分:0)

每个多对多关联都有两个方面,即拥有方和非拥有方,或反方。连接表是在拥有方指定的。

将您的@JoinTable移至UserAccountRole。在UserAccountRole实体中,尝试使用@Enumerated(STRING),以便您设置的字段作为枚举类型保留。例如:

    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "account_account_role", 
       joinColumns = { @javax.persistence.JoinColumn(name = "account_ID") }, 
       inverseJoinColumns = { @javax.persistence.JoinColumn(name = "account_role_ID") })
    @Enumerated(STRING)
    private UserAccountRoleType type;

在反面UserAccount,您应该添加以下内容:

@ManyToMany(mappedBy="type")
private Set<UserAccountRole> userRoles;

答案 1 :(得分:0)

发现错误。 在AccountController中:

错误的方式:

        HashSet<UserAccountRole> userRoles = new HashSet<>();
        UserAccountRole uar = new UserAccountRole("USER");
        userRoles.add(uar);
        user.setUserProfiles(userRoles);

FIXED:

        HashSet<UserAccountRole> userRoles = new HashSet<>();
        UserAccountRole uar = userAccountRoleService.findByType("USER");
        userRoles.add(uar);
        user.setUserProfiles(userRoles);

必须从数据库中检索AccountRole。