Spring boot JPA ManyToMany-findById中的空列表
在我的Spring Boot项目中,我有一个实体类用户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;
@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());
}