我有 AppUser 可以有很多 BookCards,它可以有很多書。我需要用他的 BookCards 物體洗掉我的 AppUser,但書本身沒有任何變化。但是當我嘗試通過這種方法做到這一點時
@Transactional
public void deleteUser(Long id) {
List<BookCard> bookCards = bookCardService.findAllUserBookCards(id);
if (!bookCards.isEmpty()) {
bookCardService.deleteBookCardByUserId(id);
}
userRepository.deleteById(id);
}
我有一個錯誤
org.hibernate.PropertyValueException: not-null property references a null or transient value : kpi.diploma.ovcharenko.entity.card.BookCard.book
這是我的 AppUser、Book 和 BookCard 類
@Getter
@Setter
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
@Table(uniqueConstraints = @UniqueConstraint(columnNames = "email"), name = "library_user")
public class AppUser {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
// other fields
@EqualsAndHashCode.Exclude
@OnDelete(action = OnDeleteAction.CASCADE)
@OneToMany(mappedBy = "book", fetch = FetchType.EAGER)
private Set<BookCard> bookCards = new HashSet<>();
// getters and setters
@Getter
@Setter
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
@Table(name = "booking_card")
@TypeDef(
name = "pgsql_enum",
typeClass = PostgreSQLEnumType.class
)
public class BookCard {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@OnDelete(action = OnDeleteAction.CASCADE)
@JoinColumn(name = "user_id", nullable = false)
private AppUser user;
@OnDelete(action = OnDeleteAction.NO_ACTION)
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "book_id")
private Book book;
// getters and setters
@Getter
@Setter
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
@Table(name = "books")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "idbooks", insertable = false, updatable = false)
private Long id;
// other fields
@EqualsAndHashCode.Exclude
@OnDelete(action = OnDeleteAction.NO_ACTION)
@OneToMany(mappedBy = "book", fetch = FetchType.EAGER)
private Set<BookCard> bookCards = new HashSet<>();
// getters and setters
如您所見,我的 Book 類具有 Set bookCards 欄位,只是為了低估我嘗試添加許多注釋,例如@OnDelete(action = OnDeleteAction.CASCADE),相信它們可以解決我的問題
據我了解,洗掉 AppUser 和他的 BookCard 沒有問題,但是因為 BookCard 與 Book 有關系,所以 hibernate 不明白如何處理 Book。那么我怎樣才能讓我的程式清楚地知道我只需要洗掉 BookCards 物體,但不要碰書本身呢?非常感謝
uj5u.com熱心網友回復:
對于可能面臨類似錯誤的未來讀者。我解決了像這樣更改物體的問題
@Getter
@Setter
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
@Table(uniqueConstraints = @UniqueConstraint(columnNames = "email"), name = "library_user")
public class AppUser {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
// other fields
@EqualsAndHashCode.Exclude
@OnDelete(action = OnDeleteAction.CASCADE)
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<BookCard> bookCards = new HashSet<>();
// getters and setters
@Getter
@Setter
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
@Table(name = "booking_card")
@TypeDef(
name = "pgsql_enum",
typeClass = PostgreSQLEnumType.class
)
public class BookCard {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER)
@JoinColumn(name = "user_id", nullable = false)
private AppUser user;
@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER)
@JoinColumn(name = "book_id")
private Book book;
// getters and setters
@Getter
@Setter
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Builder(toBuilder = true)
@Table(name = "books")
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "idbooks", insertable = false, updatable = false)
private Long id;
// other fields
@EqualsAndHashCode.Exclude
@OnDelete(action = OnDeleteAction.CASCADE)
@OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<BookCard> bookCards = new HashSet<>();
// getters and setters
這個注解解決了這個問題
org.hibernate.PropertyValueException: not-null property references a null or transient value : kpi.diploma.ovcharenko.entity.card.BookCard.book
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/483682.html
標籤:春天 PostgreSQL 弹簧靴 休眠 一对多
上一篇:使用Spring-Boot進行flyway遷移后,Hibernate無法驗證記憶體中的h2資料庫
下一篇:使用多個資料源時,SpringBootHibernate錯誤“未設定‘hibernate.dialect’時對DialectResolutionInfo的訪問不能為空”
