我正在使用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的工作方式以及最适合我的人并不熟悉