使用哪个CascadeType

时间:2019-04-06 18:16:55

标签: hibernate jpa

我正在使用JPA和具有Spring安全性的Hibernate构建应用程序。

我有2个实体: 从用户侧通过单向多对多连接的用户和票证。 我把级联= CascadeType.PERSIST。 现在,我有一个没有任何票证的用户,想要添加几张票证。每当我这样做并将用户与票证列表一起保存时,它只会将票证的ID保存到数据库中,而不是整个对象。

我尝试放置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的工作方式以及最适合我的人并不熟悉

0 个答案:

没有答案