Spring boot JPA ManyToMany-findById中的空列表

Spring boot JPA ManyToMany-findById中的空列表,spring-boot,jpa,set,many-to-many,findby,Spring Boot,Jpa,Set,Many To Many,Findby,在我的Spring Boot项目中,我有一个实体类用户 @NoArgsConstructor @AllArgsConstructor @Getter @Setter @Builder @Entity @Table(name = "applicationusers") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;

在我的Spring Boot项目中,我有一个实体类用户

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Builder
@Entity
@Table(name = "applicationusers")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    [...]

    @Singular
    @ManyToMany(
        cascade = {
            CascadeType.PERSIST,
            CascadeType.MERGE
        },
        fetch = FetchType.EAGER)
    @Fetch(value = FetchMode.SUBSELECT)
    @JoinTable(
        name = "applicationusers_roles",
        joinColumns = { @JoinColumn(name = "applicationuser_id") },
        inverseJoinColumns = { @JoinColumn(name = "role_id") }
    )
    private Set<Role> roles;
}
@noargsconstuctor
@AllArgsConstructor
@吸气剂
@塞特
@建筑商
@实体
@表(name=“applicationusers”)
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
[...]
@奇异的
@许多(
级联={
cascade type.PERSIST,
级联类型合并
},
fetch=FetchType.EAGER)
@Fetch(值=FetchMode.SUBSELECT)
@可接合(
name=“applicationusers\u角色”,
joinColumns={@JoinColumn(name=“applicationuser_id”)},
inverseJoinColumns={@JoinColumn(name=“role\u id”)}
)
私人设定角色;
}
和第二个实体类角色

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Builder
@Entity
@Table(name = "roles")
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false, unique = true)
    @Length(min = 3, max = 15)
    private String name;

    @ManyToMany(fetch = FetchType.EAGER, mappedBy = "roles")
    @Fetch(value = FetchMode.SUBSELECT)
    @Singular
    private Set<User> applicationUsers;
}
@noargsconstuctor
@AllArgsConstructor
@吸气剂
@塞特
@建筑商
@实体
@表(name=“roles”)
公共阶级角色{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
@列(nullable=false,unique=true)
@长度(最小值=3,最大值=15)
私有字符串名称;
@ManyToMany(fetch=FetchType.EAGER,mappedBy=“roles”)
@Fetch(值=FetchMode.SUBSELECT)
@奇异的
专用设置应用程序用户;
}
在我的一个测试中,我尝试将一个角色和一个用户存储到存储库中,如下所示

@Test
public void createRoleWithUsers() {
    User newUser = User.builder()
        .name("name")
        .password("1234567")
        .email("hello@world.net")
        .enabled(true)
        .build();
    User savedUser = userRepository.save(newUser);
    Set<User> users = new HashSet<>();
    users.add(savedUser);
    Role role = Role.builder()
        .name("TestRole")
        .applicationUsers(users)
        .build();
    Role createdRole = roleRepository.save(role);
    Role foundRole = roleRepository.findRoleById(createdRole.getId()).get();
    [...]
}
@测试
public void createRoleWithUsers(){
User newUser=User.builder()
.姓名(“姓名”)
.密码(“1234567”)
.电邮(“hello@world.net")
.已启用(真)
.build();
User savedUser=userRepository.save(newUser);
Set users=new HashSet();
添加(savedUser);
Role=Role.builder()
.name(“TestRole”)
.applicationUsers(用户)
.build();
Role createdRole=roleRepository.save(角色);
Role foundRole=roleRepository.findRoleById(createdRole.getId()).get();
[...]
}
调试这段代码时,我发现
createdRole
按预期设置了用户,但
foundRole
没有

如何让
foundRole
中的用户也参与进来


如果您需要存储库代码,请告诉我-这是一个非常简单的界面,所以我跳过了它。

简单回答,请阅读精细手册:


我尝试了你的解决方案——尽我所能——但没有成功地让它正确运行。也许我做错了什么。然而,更奇怪的是,我只删除了
mappedBy
注释,就成功地让它正常工作了。我怀疑我的解决方案是正确的,我不明白为什么这样做有效。----------洛利只是通过从我的
角色
类中删除
mappedBy
命令才使它有效。然而,我怀疑,这是一个正确的解决方案,我不明白为什么这是工作。
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Builder
@Entity
@Table(name = "applicationusers")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Singular
    @ManyToMany
    private Set<Role> roles;
}
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@Builder
@Entity
@Table(name = "roles")
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany(mappedBy = "roles")
    @Singular
    private Set<User> applicationUsers;
}
public interface RoleRepository extends JpaRepository<Role, Long>{
    @Query("select r from Role r where r.id = :id")
    @EntityGraph(attributePaths = {"applicationUsers"})
    Role findByIdFetchUsers(@Param("id") Long id);
}
@Override
public void run(String... args) throws Exception {
    User u = save();
    Role r2 = roleRepository.findByIdFetchUsers(u.getId());
    System.out.println("R: " + r2 + " : " + r2.getApplicationUsers());
    Role r1 = roleRepository.findById(u.getId()).get();
    System.out.println("R: " + r1 + " : " + r1.getApplicationUsers());
}