我總是有一個例外,當我試圖
Book book = new Book();
book.setAuthor_id(4);
book.setTitle("test");
作者等級:
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private long id;
@Column(name = "name")
private String name;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "author")
private Set<Book> books;
// getters and setters
書類:
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private long id;
@Column(name = "title")
private String title;
@Column(name = "author_id")
private long author_id;
@ManyToOne(optional = false, cascade = CascadeType.ALL)
@JoinColumn(name = "author_id")
private Author author;
//getters and setters
我正在嘗試沒有,private long author_id但后來我無法設定作者 ID 我該如何解決?
uj5u.com熱心網友回復:
這是因為您將author_idcolumn映射author_id到author. Book這是不允許的,因為如果它們有不同的值,Hibernate 不知道 author_id在更新/插入其值時應該將哪個值用于列。
因此,要么洗掉其中一個,要么將其中一個配置為只讀:
要配置author_id為只讀,您可以執行以下操作:
@Column(name = "author_id" , insertable=false, updatable=false)
private long author_id;
要配置Author為只讀,您可以執行以下操作:
@ManyToOne(optional = false, cascade = CascadeType.ALL)
@JoinColumn(name = "author_id", insertable=false, updatable=false)
private Author author;
更好的解決方案是確保只有一個欄位映射到author_id,所以我會洗掉author_id欄位。
要為一本書配置作者,最好先從資料庫中查詢作者。它還可以幫助驗證具有給定 ID 的作者是否真的存在。否則,如果沒有具有該 ID 的作者,則在保存 Book 時將違反其 FK 約束。由于您已經獲得了 Author 實體,您可以簡單地使用它來配置新書的 Author。
如果你真的想保存一個 DB 呼叫來獲取作者,你可以考慮使用EntityManager's getReference()來獲取 Author 代理,這樣你就可以使用它來配置新書的作者:
Author author = entityManager.getReference(Author.class , 4);
Book book = new Book();
book.setAuthor(author);
book.setTitle("test");
有關以下行為的更多詳細資訊,另請參閱getReference()
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/463973.html
上一篇:具有多對多關聯物體的持久物體拋出“org.hibernate.PersistentObjectException”
