#java #mysql #spring-boot #transactions #relationship
#Ява #mysql #пружинный ботинок #операции #отношения
Вопрос:
поэтому я пытаюсь установить два связанных объекта в полях друг друга. Но когда я отлаживаю код, я получаю это после того, как я установил первый объект в качестве поля в другом, я получаю следующую ошибку: com.sun.jdi.InvocationException: в целевой виртуальной машине произошло исключение, вызвавшее метод.
Вот исходный код, я надеюсь, что кто-нибудь сможет помочь. Спасибо 😀
@Service @Transactional public class MainService { @Autowired CustomTableRepository tRepo; @Autowired UserRepository uRepo; @Autowired ReservationRepository rRepo; @SneakyThrows public void reserveTable(Reservation reservation) { CustomTable table = tRepo.findById(reservation.getTable().getId()).get(); User user = uRepo.findByUsername(reservation.getUser().getUsername()); Reservation myReservation = new Reservation(null, reservation.getAccepted(), user, table, reservation.getTime()); rRepo.saveAndFlush(myReservation); if(!(reservationRequirements(rRepo.findByUser(user)))) throw new Exception("something went wrong with the reservation, regarding the requierements"); else { user.setBalance(user.getBalance() - CONSTANTS.fee ); user.setReservation(myReservation); myReservation.setAccepted(true); myReservation.setTable(table); myReservation.setUser(user); table.setReservation(myReservation); table.setAvailable(false); uRepo.saveAndFlush(user); tRepo.saveAndFlush(table); rRepo.save(myReservation); } } /* * PRIVATE HELPING METHODS */ private Boolean reservationRequirements(Reservation reservation) { User user = uRepo.findByUsername(reservation.getUser().getUsername()); //check if the user has enough money if(user.getBalance() lt; CONSTANTS.fee) return false; //check if they accepted the money fee. if(reservation.getAccepted() == false) return false; //if the table is occupied if(reservation.getTable().getAvailable() == null) { }else { if(reservation.getTable().getAvailable() == false) return false; } LocalTime time = CONSTANTS.parseLocalTime(reservation.getTime()); if(!(time.isAfter(LocalTime.parse("07:30")) amp;amp; time.isBefore(LocalTime.parse("22:00")))) return false; return true; } }
Вот как все они связаны друг с другом:
Классы сущностей:
@Entity @Data @NoArgsConstructor @AllArgsConstructor public class CustomTable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private Boolean available; private Boolean busy; private Boolean arrived; @OneToOne(mappedBy = "table", cascade = CascadeType.ALL, orphanRemoval = true) private Reservation reservation; } @Entity @Data @NoArgsConstructor @AllArgsConstructor public class Reservation { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; private Boolean accepted; @OneToOne @JoinColumn(name = "user_id") private User user; @OneToOne @JoinColumn(name = "table_id") private CustomTable table; private String time; } @Entity @Data @NoArgsConstructor @AllArgsConstructor public class Role { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; private String type; } @Entity @Data @NoArgsConstructor @AllArgsConstructor public class User { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; private String username; private String password; private Long number; private Long balance; @OneToOne(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true) private Reservation reservation; @ManyToMany(fetch = FetchType.EAGER) private Collectionlt;Rolegt; roles; }
Большое вам спасибо за чтение.
Комментарии:
1. Кстати, я также нахожусь в бесконечном цикле из-за отношений таблицы бронирования пользователей
2. Для вашего исключения: я мог бы указать только на 1 вещь. получаете ли вы исключение после этого :
rRepo.saveAndFlush(myReservation);
если да, то вам не следует очищать данные. попробуйте сохранить данные без промывки.