Spring Boot JPA@JoinTable,现有映射表忽略@GeneratedValue
我试图在两个实体Spring Boot JPA@JoinTable,现有映射表忽略@GeneratedValue,spring,spring-boot,spring-data,spring-data-jpa,Spring,Spring Boot,Spring Data,Spring Data Jpa,我试图在两个实体User和UserRole之间创建一个manytomy关系 在映射表UserToRoleMapping中我需要一些额外的列,因此我为映射表创建了一个带有额外列的实体(如createdDate或isActive) 现在的问题是JPA忽略映射表UserRoleMappingGid列上的@Id和@GeneratedValue注释,并使用userId,roleId创建一个复合主键。没关系。由于userRoleMappingId列不是主键,我不再需要它,但一旦我删除它,JPA就会抱怨它需要
User
和UserRole
之间创建一个manytomy
关系
在映射表UserToRoleMapping
中我需要一些额外的列,因此我为映射表创建了一个带有额外列的实体(如createdDate
或isActive
)
现在的问题是JPA忽略映射表UserRoleMappingGid
列上的@Id
和@GeneratedValue
注释,并使用userId,roleId
创建一个复合主键。没关系。由于userRoleMappingId
列不是主键,我不再需要它,但一旦我删除它,JPA就会抱怨它需要一个带有@Id
注释的列
即使我让它保持原样,当使用spring-datarepository for User
将User
与一些角色一起保存时,它抛出一个异常,userRoleMappingId
列不能为null,因为存储库不尝试为映射表生成ID,并且它被设置为notnull
理想情况下,我希望在带有序列生成器的映射表中有一个主键
正确的方法是用什么创建具有额外列的JoinTable
实体
下面是一个带有示例代码的github存储库,用于重现该问题
以下是实体代码
@实体
@SequenceGenerator(name=“USER_SEQ”)
类用户{
@身份证
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“用户顺序”)
私有长用户ID;
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(name=“UserRoleMapping”、joinColumns=@JoinColumn(name=“userId”)、inverseJoinColumns=@JoinColumn(name=“roleId”))
私人设定角色;
/*接球手和接球手*/
}
@实体
@SequenceGenerator(name=“ROLE_SEQ”)
阶级角色{
@身份证
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“角色顺序”)
私人长罗莱德;
/*接球手和接球手*/
}
@实体
@SequenceGenerator(name=“用户角色”)
类用户角色映射{
@身份证
@GeneratedValue(策略=GenerationType.SEQUENCE,generator=“用户角色顺序”)
私有长用户角色映射;
@奥内托内
@JoinColumn(name=“userId”)
私人用户;
@奥内托内
@JoinColumn(name=“roleId”)
私人角色;
私人日期创建日期;
/*接球手和接球手*/
}
实体声明没有反映文章中提到的所需关系。它们应声明如下:
用户实体
这将确保每个
用户
可以有多个角色
s,同样地,每个角色
可以分配给多个用户
s,这样,如果用户
s和角色
s一起查看,将看到多对多映射。我需要用户
和角色
之间的@manytomy
关系,因此需要@JoinTable
。请再次检查问题。@11thdimension,您将获得与我的答案的@manytomy
关系(每个用户可以有角色,每个角色可以分配给多个用户)。仔细阅读答案并试一下。对于映射表,@ManyToMany
根本不起作用,这似乎让您感到困惑。在您的实体中,(userId,roleId)之间的映射将存储在哪里?好的,我没有看到您正在使用UserRole
作为映射表,我的用户表中是否一定要有映射表的名称?我不能直接获取角色列表吗?这应该可以直接在User
类的getRoles
方法中编码为return Roles.stream().map(UserRole::getRole).collect(Collectors::toList)代码>如果您使用Java8。如果不使用Java8,该方法将稍微长一点,但同样的翻译可以很容易地应用。
@Entity
public class User {
@Id
private long id;
@OneToMany(mappedBy = "user")
private List<UserRole> roles;
}
@Entity
public class UserRole {
@Id
private long id;
@ManyToOne
@JoinColumn(name="userId")
private User user;
@ManyToOne
@JoinColumn(name="roleId")
private Role role;
}