java—如何在多个方面使用@onetomany和@embeddedid配置enver

yqyhoc1h  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(451)

我有一个 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;

pxyaymoc

pxyaymoc1#

我会尝试用insert=“false”update=“false”Map用户,因为设置它的位置在用户实体中。
在代码中,usercompanyrole实体中有两个用户id,一个是embeddedid,另一个是audited字段,因为用于查询的是id,请注意audited字段中的insert=“false”update=“false”。

eqqqjvef

eqqqjvef2#

我以前遇到过这个问题,和你上面描述的关系相似。我不认为它与enver有关,因为我没有使用enver,但是我看到了与您看到的类似的异常。我想您可以通过临时删除@audited和@auditmappedby注解来测试这一点,并查看是否对usercompanyrole和usercompanyrole\u aud有类似的异常?
为了避免“Map中的重复列”错误,您可能需要尝试以下操作:
从user.usercompanyroles中删除@joincolumn注解
将删除的@joincolumn注解移动到usercompanyrole.user
如果上述步骤不起作用,请将usercompanyrole@joincolumn转换为@joinformula,如下所示:

@EmbeddedId
private UserCompanyRoleId userCompanyRoleId;

@ManyToOne(fetch = FetchType.LAZY)
@MapsId("userId")
@JoinFormula(value = "user_id", referencedColumnName= "<user pk column name>")
@Audited
private User user;

公式方法防止hibernate向Map中添加另一个“userid”列。
我假设用户有一个简单的id/主键,正如前面没有提到的。如果它也是化合物,则需要以下内容:

@JoinColumnsOrFormulas(value = {
            @JoinColumnOrFormula(formula = @JoinFormula(value = "tid", referencedColumnName = "tid")),
            @JoinColumnOrFormula(column = @JoinColumn(name = "delegate_id", referencedColumnName = "id",
                    updatable = false, columnDefinition = ENTITY_ID_DEF,
                    foreignKey = @ForeignKey(name = "fk_delegation_identity")))
    })

相关问题