我的代码存在很大问题:
这是我的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个以上的链接)
答案 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。