我有一个 User
实体和a UserCompanyRole
实体。这个 UserCompanyRole
具有复合主键。每个 User
可以有多个角色。我知道应该避免使用复合主键,实际上我已经用id列替换了它,但我仍然想知道是我的代码引起了问题还是环境问题。以下代码的结果是在开始时出错。知道怎么了吗
原因:javax.persistence.persistenceexception:[persistenceunit:default]无法构建hibernate sessionfactory;嵌套异常为org.hibernate.mappingexception:实体Map中的重复列:domain.usercompany.usercompanyrole\u aud列:user\u id(应使用insert=“false”update=“false”进行Map)
文件 User.java
```
@Audited(withModifiedFlag = true, modifiedColumnName = "user_company_roles_mod")
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "user_id", insertable = false, updatable = false)
@AuditMappedBy(mappedBy = "user")
private List userCompanyRoles = new ArrayList<>();
文件 `UserCompanyRole.java` ```
@EmbeddedId
private UserCompanyRoleId userCompanyRoleId;
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("userId")
@Audited
private User user;
文件 UserCompanyRoleId.java
```
@Embeddable
public class UserCompanyRoleId implements Serializable {
@Column(name = "company_id")
private Long companyId;
@Column(name = "user_id")
private Long userId;
@Column(name = "role")
private String role;
2条答案
按热度按时间pxyaymoc1#
我会尝试用insert=“false”update=“false”Map用户,因为设置它的位置在用户实体中。
在代码中,usercompanyrole实体中有两个用户id,一个是embeddedid,另一个是audited字段,因为用于查询的是id,请注意audited字段中的insert=“false”update=“false”。
eqqqjvef2#
我以前遇到过这个问题,和你上面描述的关系相似。我不认为它与enver有关,因为我没有使用enver,但是我看到了与您看到的类似的异常。我想您可以通过临时删除@audited和@auditmappedby注解来测试这一点,并查看是否对usercompanyrole和usercompanyrole\u aud有类似的异常?
为了避免“Map中的重复列”错误,您可能需要尝试以下操作:
从user.usercompanyroles中删除@joincolumn注解
将删除的@joincolumn注解移动到usercompanyrole.user
如果上述步骤不起作用,请将usercompanyrole@joincolumn转换为@joinformula,如下所示:
公式方法防止hibernate向Map中添加另一个“userid”列。
我假设用户有一个简单的id/主键,正如前面没有提到的。如果它也是化合物,则需要以下内容: