Cześć
Mam problem z moją aplikacją i nawet nie wiem już, gdzie szukać, bo nigdy wcześniej nie miałem problemów przy innych projektach. Zaznaczam, że dopiero się uczę i to jest kwestia nauki. Mianowicie robię prosty projekt na zasadzie, że mamy pralkę, która po uruchomieniu z linka (REST Controller) zmienia się jej Mode
i "pracuje", a potem kończy pracę i też zmienia się jej Mode
. Problem jest z zaciąganiem danych z bazy oraz ze zmianą danych poprzez adnotacje @Modyfing
i @Query
w Repo. Pierw przedstawię dane i będzie łatwiej wytłumaczyć. Dane tak jak poniżej:
@AllArgsConstructor
@RequiredArgsConstructor
@Getter
@Setter
@Entity
public class WashingMachine {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
private UUID uuid;
@Enumerated(EnumType.STRING)
private Mode mode;
}
Mode
jak widać, jest Enumem i jest do wyboru ON, OFF, PAUSE, RUN i FINISH. Repo to jak poniżej:
@Repository
public interface WashingMachineRepository extends CrudRepository<WashingMachine, Integer> {
List<Job> findAll();
@Modifying
@Query("update WashingMachine w set w.mode = :mode where w.uuid = :uuid")
@Transactional
void updateMode(@Param(value = "uuid") UUID uuid, @Param(value = "mode") Mode mode);
}
I ta metoda totalnie nie działa. Status zostaje zmieniony w bazie, ale jeśli chcę go wyciągnąć to mi wyskakuje poprzedni. I teraz Serwis:
@Service
@RequiredArgsConstructor
public class WashingMachineService {
private final WashingMachineRepository washingMachineRepository;
public void pauseWashing(UUID uuid) {
// washingMachineRepository.updateMode(wm.getUuid(), MODE.PAUSE);
updateModeManually(uuid, Mode.PAUSE);
}
}
public String startWashing(WashingMachine wm) throws Exception {
wm.setUuid(UUID.randomUUID());
wm.setMode(Mode.RUN);
washingMachineRepository.save(wm);
for (int i = 0; i < 20; i++) {
if (washingMachineRepository.findAll().get(0).getMode().equals(Mode.PAUSE)) { //obojętnie czy zrobię to po prostu
// wm.getMode().equals(Mode.PAUSE)
break;
// throw new Exception("Washing machine paused");
}
System.out.println("washing in progress");
TimeUnit.SECONDS.sleep(5);
}
// washingMachineRepository.updateMode(wm.getUuid(), Mode.FINISH);
updateModeManually(wm.getUuid(), Mode.FINISH);
System.out.println(findByUUID(wm.getUuid()).getMode());
return "Washing done";
}
private void updateModeManually(UUID uuid, Mode mode) { //to jest zmiana manualna
WashingMachine wm = findByUUID(uuid);
wm.setMode(mode);
washingMachineRepository.save(wm);
}
public WashingMachine findByUUID(UUID uuid) {
return washingMachineRepository.findAll().stream()
.filter(w -> w.getUuid().equals(uuid))
.findFirst()
.orElseThrow(() -> new NotFoundException(uuid));
}
}
No i teraz 2 problemy:
- Metoda z Repo
updateMode
nie działa i nie wiem czemu, bo sprawdziłem i jest de facto taka sama jak w innych projektach. W serwisie jest zakomentowana. Problem jest taki, że jak jej użyję to jak wejdę przez konsolę H2 to w Repo jest tenMode
zmieniony na prawidłowy. Ale jak robięprint
to wyświetla mi poprzedni. Przez to musiałem zmienić i zrobić to "manualnie" tak jak widać. I wtedy "teoretycznie" już działa. - ALE jak chcę użyć metody
pauseWashing
to nic się nie zmienia - nieważne czy jest wstawionybreak
czy zakomentowanyException
. A przecież w pętli jest użyty odczyt z bazy aktualnegoMode
. Jak sprawdzałem to tak samo w ogóle nie zczytuje z bazy danych aktualnego, już zmienionego statusu.
No i tutaj jest pytanie? Gdzie zrobiłem ten czeski błąd? Ja wiem, że to pierdoła, ale pytanie które to xD Próbowałem wszystkiego, w pom'ie jest standardowo: spring starter web, spring starter test, spring devtools, lombok, spring starter data jpa
. Dodałem ekstra mysql connector java
i hibernate core
w razie w, bo może tutaj jest problem (wiem, że spring data jpa zawiera hibernate). W propertiesach tylko podstawowe ustawienia pod bazę H2, z czego jest zaciągana z memory, ale nic więcej.
Będę bardzo wdzięczny za pomoc!