Wpis z mikrobloga

Z mysql wszystkie testy przechodzą a z h2
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint ["FK3WBP3ONQPA33SU5HDSG59EJ6Q: PUBLIC.VOTE FOREIGN KEY(ACTIVITYID) REFERENCES PUBLIC.ARTICLE(ID) (14)"; SQL statement:
insert into vote (id, activity
id, activitytype, userid, vote_type) values (null, ?, ?, ?, ?) [23506-197]]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
(°°


#java #bazydanych
  • 18
@Cheessys używasz czegoś do wypełniania bazy dla testów? Np. DbUnita? Ja miałem dokładnie taki problem kiedy DbUnit chciał usunąć jakiś wiersz, ktory miał klucz obcy w innej tabeli, a ta tabela nie była w jego DataSetcie bo wiersz do niej wrzucił kawałek kodu wywołany przez test w drugim wątku.
@Cheessys: Odpaliłem Twoje testy:

[INFO] Results:
[INFO]
[INFO] Tests run: 148, Failures: 0, Errors: 0, Skipped: 0

Obstawiam, że po prostu nie czyścisz schematu ani bazy przed testami i dlatego wychodzą Ci takie dziwactwa.
@Cheessys: Dodając to

@OneToMany(cascade = CascadeType.ALL,mappedBy = "activityId")

@JsonIgnore

private List votes = new ArrayList<>();:


Powiedziałeś, że ID w encji Vote wskazuje na tabelę Article
Zaraz, zaraz, jak to Article skoro ten kod jest w klasie Activity i kilka klas go rozszerza?
A no Activity prawdopodobnie jest mapowane jako pierwsze (bo zaczyna się na literę A) i dlatego tworzony akurat taki constrain. Potem ustawiając w Vote jako ID np. id
@Cheessys: W taki sposób jak zrobiłeś, mogą ale nie ustawisz 4 kluczy obcych. Joiny na bazie możesz sobie robić do jakich pół chcesz ale bez kluczy obcych nie zapewnisz spójności danych.

Hibernate, z tego co pamiętam, pozwala na trzymanie w jedynej tabeli kilku różnych entity które dziedziczą po tym samym obiekcie ale to jest bardzo rzadko spotykane rozwiązanie (jeśli dobrze pamiętam jak to działało, użyłem tego raz w projekcie).