SpringBoot JPA - User 和 UserStats 之间映射的多对一关系,但是当我从 Repo 获取 User 时,没有 UserStats 实体?
SpringBoot JPA - Many To One relation mapped between User and UserStats, but when I get the User from Repo, has no UserStats entities?
我有一个域实体用户,因为我需要为竞争性和非竞争性游戏的每个用户创建 2 个独立的统计数据集,它与 UserStats 有一对多关系,每个用户应该包含 2 个 UserStat 对象列表 userStats 对象。
但是,当我调用 userRepo.findAllBy(SomeCondition) 时,返回的 List 包含 User 对象但那些 User 对象不包含 UserStat 对象?
用户Class:
@Entity(name = "User")
@Table(name = "user")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "username", unique = true)
private String username;
@Column(name = "password")
private String password;
private String name;
private String email;
private String location;
@JsonIgnore
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
private List<UserStats> userStats;
}
用户统计CLASS:
@Entity()
@Table(name = "userStats")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class UserStats {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userStatsId;
private Integer victories;
private Integer draws;
private Integer defeats;
private boolean isLeagueUserStats;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
}
用户服务注册方法:
public void signUpUser(User user) {
user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
User savedUser = userRepository.save(user);
List<UserStats> userStatsList = new ArrayList<>();
UserStats userStats = new UserStats(0, 0, 0, false, savedUser);
UserStats leagueUserStats = new UserStats(0, 0, 0, true, savedUser);
userStatsRepository.save(userStats);
userStatsRepository.save(leagueUserStats);
userStatsList.add(userStats);
userStatsList.add(leagueUserStats);
user.setUserStats(userStatsList);
User savedUser2 = userRepository.save(user);
}
我怎样才能做到在保存用户实体时它也保存它包含的 UserStats?当您从包含 userStats 列表的存储库中检索用户对象时,我该如何做到这一点?
谢谢
可能是你需要加级联才能让他级联保存
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
而且,我不确定您是否有意使用 LAZY fetchType,但是如果您在任何时候加载某些数据时遇到问题(我的意思是,如果它只给您带来空数据),它可能是因此,在这种情况下,您将不得不使用 EAGER 而不是 LAZY
我有一个域实体用户,因为我需要为竞争性和非竞争性游戏的每个用户创建 2 个独立的统计数据集,它与 UserStats 有一对多关系,每个用户应该包含 2 个 UserStat 对象列表 userStats 对象。
但是,当我调用 userRepo.findAllBy(SomeCondition) 时,返回的 List 包含 User 对象但那些 User 对象不包含 UserStat 对象?
用户Class:
@Entity(name = "User")
@Table(name = "user")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(name = "username", unique = true)
private String username;
@Column(name = "password")
private String password;
private String name;
private String email;
private String location;
@JsonIgnore
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
private List<UserStats> userStats;
}
用户统计CLASS:
@Entity()
@Table(name = "userStats")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class UserStats {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userStatsId;
private Integer victories;
private Integer draws;
private Integer defeats;
private boolean isLeagueUserStats;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
}
用户服务注册方法:
public void signUpUser(User user) {
user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
User savedUser = userRepository.save(user);
List<UserStats> userStatsList = new ArrayList<>();
UserStats userStats = new UserStats(0, 0, 0, false, savedUser);
UserStats leagueUserStats = new UserStats(0, 0, 0, true, savedUser);
userStatsRepository.save(userStats);
userStatsRepository.save(leagueUserStats);
userStatsList.add(userStats);
userStatsList.add(leagueUserStats);
user.setUserStats(userStatsList);
User savedUser2 = userRepository.save(user);
}
我怎样才能做到在保存用户实体时它也保存它包含的 UserStats?当您从包含 userStats 列表的存储库中检索用户对象时,我该如何做到这一点?
谢谢
可能是你需要加级联才能让他级联保存
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
而且,我不确定您是否有意使用 LAZY fetchType,但是如果您在任何时候加载某些数据时遇到问题(我的意思是,如果它只给您带来空数据),它可能是因此,在这种情况下,您将不得不使用 EAGER 而不是 LAZY