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;
}