Я создаю приложение с JPA и Hibernate с Spring безопасности.
У меня есть 2 объекта:
Пользователь и билет, которые связаны однонаправленным отношением многие ко многим со стороны пользователя.
Я поставил cascade = CascadeType.PERSIST.
Теперь у меня есть пользователь без каких-либо билетов и хочу добавить несколько. Всякий раз, когда я делаю это и сохраняю пользователя со списком заявок, в базу данных сохраняются только идентификаторы билетов, а не весь объект.
Я попытался поставить cascade = CascadeType.MERGE, и он отлично сохраняет объект заявки при сохранении пользователя, но когда я создаю новых пользователей и предоставляю им список тикетов, а затем сохраняю пользователя, выдается следующая ошибка:
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: com.karnavauli.app.model.entities.Ticket
Это мой пользователь и заявка:
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
public class User {
@Id
@GeneratedValue
private Long id;
private String username;
private String password;
@Enumerated(EnumType.STRING)
private Role role;
private Integer numberOfTickets;
@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
@JoinTable(
name = "User_Ticket",
joinColumns = { @JoinColumn(name = "user_id") },
inverseJoinColumns = { @JoinColumn(name = "ticket_id") }
)
private List<Ticket> tickets;
@Override
public String toString() {
return username;
}
}
@Entity(name = "Bilety")
@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder
public class Ticket {
@Id
@GeneratedValue
private Long id;
@Column(name = "skrot")
private String shortName;
@Column(name = "pelna_nazwa")
private String fullName;
@Column(name = "uczelnia")
private Boolean isUni;
@OneToMany(mappedBy = "ticket")
@ToString.Exclude
@EqualsAndHashCode.Exclude
private List<KvTable> tables;
}
Я бы хотел сохранить пользователя с предоставленным списком билетов без получения этих ошибок, но я не очень хорошо знаю, как работают эти CascadeTypes и какой из них подходит мне лучше всего