Spring Boot StackOverFlowError : Null
Spring Boot StackOverFlowError : Null
当我想通过 foreach 循环保存存储库时遇到问题。通过 Foreach
循环用户来把它保存到另一个实体
User.class
public class 出勤率 {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String status;
@ManyToOne(cascade = {CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.DETACH})
@JoinColumn(name="user_id", nullable=false)
private User user;
}
User.class
这是用户实体
的用户 class
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String username;
@OneToMany(mappedBy = "user",cascade = CascadeType.ALL)
@JsonIgnore
private List<Attendance> attendances;
错误显示:: java.lang.WhosebugError: null
@Scheduled(initialDelay = 10000,fixedDelay = 30000)
public void insertHolidaysAttendance() throws Exception {
Calendar c1 = Calendar.getInstance();
if ((c1.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) || (c1.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY)) {
List<User> userList = userService.fetchUserList();
List<Attendance> attendanceList = new ArrayList<>();
for (User user: userList){
Attendance attendance = new Attendance();
System.out.println("Curent user "+user);
attendance.setStatus("WEEKEND");
attendance.setUser(user);
attendanceList.add(attendance);
}
System.out.println("Attendance List "+attendanceList+"\n");
attendanceRepository.saveAll(attendanceList);
userList.clear();
attendanceList.clear();
} else {
System.out.println("Today is working Day");
}
}
混合我在您的代码中看到的内容和您在评论中所说的内容,我发现有罪。
- 触发线:
System.out.println("Attendance List "+attendanceList+"\n");
- 原因:
@Data
此注释将在您的对象上添加一个 toString 实现,默认情况下它会打印所有非静态字段...导致无限循环调用,因为出勤尝试打印用户然后用户尝试打印出勤并再次出勤尝试打印用户...您正在循环播放。
要么在两个关系之一上添加注解@ToString.Exclude
,要么自己重写toString实现。
始终关注像 Lombok 这样的代码生成框架。它可能会给您一些令人讨厌的惊喜 ;-)
当我想通过 foreach 循环保存存储库时遇到问题。通过 Foreach 循环用户来把它保存到另一个实体
User.class
public class 出勤率 {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String status;
@ManyToOne(cascade = {CascadeType.MERGE,CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.DETACH})
@JoinColumn(name="user_id", nullable=false)
private User user;
}
User.class 这是用户实体
的用户 class@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String username;
@OneToMany(mappedBy = "user",cascade = CascadeType.ALL)
@JsonIgnore
private List<Attendance> attendances;
错误显示:: java.lang.WhosebugError: null
@Scheduled(initialDelay = 10000,fixedDelay = 30000)
public void insertHolidaysAttendance() throws Exception {
Calendar c1 = Calendar.getInstance();
if ((c1.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) || (c1.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY)) {
List<User> userList = userService.fetchUserList();
List<Attendance> attendanceList = new ArrayList<>();
for (User user: userList){
Attendance attendance = new Attendance();
System.out.println("Curent user "+user);
attendance.setStatus("WEEKEND");
attendance.setUser(user);
attendanceList.add(attendance);
}
System.out.println("Attendance List "+attendanceList+"\n");
attendanceRepository.saveAll(attendanceList);
userList.clear();
attendanceList.clear();
} else {
System.out.println("Today is working Day");
}
}
混合我在您的代码中看到的内容和您在评论中所说的内容,我发现有罪。
- 触发线:
System.out.println("Attendance List "+attendanceList+"\n");
- 原因:
@Data
此注释将在您的对象上添加一个 toString 实现,默认情况下它会打印所有非静态字段...导致无限循环调用,因为出勤尝试打印用户然后用户尝试打印出勤并再次出勤尝试打印用户...您正在循环播放。
要么在两个关系之一上添加注解@ToString.Exclude
,要么自己重写toString实现。
始终关注像 Lombok 这样的代码生成框架。它可能会给您一些令人讨厌的惊喜 ;-)