StaleStateException podczas zapisu encji z relacją OneToMany

StaleStateException podczas zapisu encji z relacją OneToMany
BA
  • Rejestracja:prawie 17 lat
  • Ostatnio:ponad 3 lata
0

Mam dziwny problem z Hibernate.
Przykładowo jest grupa, do której należą członkowie. Tabela z członkami nie ma swojego id z auto incrementem, dlatego jest założony pk na dwie kolumny. Tego nie zmienię bo nie mogę edytować bazy. Encje wyglądają tak:

Kopiuj
@Entity
@Table(name = "group")
@Data
public class Group implements Serializable {
    @Column(name = "id")
    @Id
    @SequenceGenerator(name = "group_seq", sequenceName = "group_seq", allocationSize = 1)
    @GeneratedValue(generator = "group_seq", strategy = GenerationType.SEQUENCE)
    private Long id;

    @NotNull
    private String name;
    
    @OneToMany
    @JoinColumn(name = "group_id")
    @BatchSize(size = 25)
    private final List<Member> members = new ArrayList<>();
}

@Data
@Entity
public class Member implements Serializable {

    @Id
    @Column(name = "group_id")
    private Long groupId;

    @Id
    @NotNull
    private String username;
    
    @NotBlank
    private String description;
}

wartości przed zapisem to coś takiego:

Kopiuj
{
  id: null,
  name: "abc",
  members: [
    {
      group_id: null,
      username: "cat",
      description: "abc"
    },
    {
      group_id: null,
      username: "dog",
      description: "cba"
    }
  ]
}

Używam GroupRepository extends JpaRepository i zapisuję tak: groupRepository.save(group);

Błąd jaki dostaję:

Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

Dodałem logowanie sql w konsoli i widzę, że insert dla grupy leci prawidłow, ale dla membera już nie:

update member set group_id=2 where group_id=null and description=abc

Nie mam pojęcia dlaczego próbuje zapisywać przez update i w dodatku group_id jest nullem, pomimo tego, że zna jego wartość...

edytowany 1x, ostatnio: baambaam
IV
  • Rejestracja:ponad 4 lata
  • Ostatnio:3 miesiące
  • Postów:30
0

Na encji Member masz dwa pola oznaczone jako @Id, więc która właściwie jest identyfikatorem? Raczej nie pole groupId, bo z kodu wynika, że wiele encji Member może być w tej samej grupie.

Zobacz pozostałe 3 komentarze
IV
@baambaam: Jeden błąd zamieniłeś na drugi, powinieneś przyjrzeć się adnotacji @IdClass, @EmbeddedId i chyba też @MapsId.
baant
Albo po prostu dodac jeszcze jedno pole, id xd
Shalom
Albo pozbyć się JPA i problem zniknie jak renkom odjoł ;) bo zwyczajnie napiszesz takie query jakie chcesz i zmapujesz tak jak chcesz.
BA
@ivo: próbowałem tego @idClass, ale dostaję No part of a composite identifier may be null; nested exception is org.hibernate.HibernateException: No part of a composite identifier may be null, a do czasu aż group się nie zapisze to group_id będzie nullem. Najchętniej to bym dodał ten id z auto incrementem do tabeli... ale nie mogę ;/ @Shalom to stary projekt i aż tak nie chcę tego przerabiać :p może z rana coś wymyślę...
IV
@baambaam: Jak masz @JoinColumn(name = "group_id") to spróbuj zamienić na @JoinColumn(name = "group_id", nullable = false).
baant
  • Rejestracja:ponad 11 lat
  • Ostatnio:2 miesiące
  • Lokalizacja:Wrocław
  • Postów:524
0

Jeśli naprawde chcesz sie babrać w tym ormowym syfie to zrób pauze, zaparz herbatke, usiądź wygodnie i poczytaj sobie z góry na dół: https://docs.jboss.org/hibernate/orm/6.0/userguide/html_single/Hibernate_User_Guide.html

Długo Ci to wcale nie zajmie a przestaniesz błądzić na oślep i dodawać losowe adnotacje aż zadziała :)

edytowany 2x, ostatnio: baant
BA
popatrzę... faktycznie na razie to błądzenie, bo na co dzień nie zajmuję się javą, ale widzę w czym jest problem... transakcja + chyba klucz pk na parę kolumn, gdzie jedna z nich jest kluczem obcym.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.