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ść...
@IdClass
,@EmbeddedId
i chyba też@MapsId
.Shalomjak renkom odjoł
;) bo zwyczajnie napiszesz takie query jakie chcesz i zmapujesz tak jak chcesz.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ę...@JoinColumn(name = "group_id")
to spróbuj zamienić na@JoinColumn(name = "group_id", nullable = false)
.