Какой CascadeType использовать - PullRequest
0 голосов
/ 06 апреля 2019

Я создаю приложение с 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 и какой из них подходит мне лучше всего

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...