StaleStateException podczas zapisu encji z relacją OneToMany

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:

@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:

{
  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ść...

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.

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 :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1