3 回答

TA貢獻1828條經驗 獲得超6個贊
在 ManyToOne 實體中,您只需要在 @JoinColumn 注釋中指定外鍵的名稱,如下所示:
@Entity
@Table(name = "BOOK")
public class Book{
//private Long bid;
@ManyToOne
@JoinColumn(name="oid")
private User user;
}
參數referencedColumnName最常用于多對多關系。

TA貢獻1775條經驗 獲得超11個贊
Hibernate 是一個對象關系映射器,以通常的面向對象的方式表示關系數據庫的基于表的數據結構,僅此而已。
您不必使用@ManyToOne、@OneToMany 等注釋。您可以這樣做:
@Entity
@Table(name="USER")
public class User {
@Id
@Column(name = "uid")
private Long uid;
// setters and getters
}
@Entity
@Table(name = "BOOK")
public class Book {
@Id
@Column(name = "bid")
private Long bid;
@Column(name = "oid")
private Long oid;
// setters and getters
}
EntityManager em;
Long uid = em.createQuery("SELECT u.uid FROM User u WHERE ....", Long.class).getSingleResult();
book.setUid(uid);
大多數開發人員不想處理那么多的 ID 和數據庫訪問等。他們只想以一種自然的面向對象的方式訪問他們的業務模型,然后 hibernate 或 JPA 進來了:
EntityManager em;
User user1 = em.find(User.class, 1L);
Book book1 = new Book();
book1.setUser(user1);
您不必為每個 Book 實例創建一個 User 實例。只需重用現有的 User 實例。
在您的示例中,我將執行以下操作:
@Entity
@Table(name="USER")
public class User {
// ...
@OneToMany(mappedBy = "user")
private Collection<Book> books = new ArrayList<>();
public void add(Book book) {
book.setUser(this);
books.add(book);
}
public void remove(Book book) {
book.setUser(null);
books.remove(book);
}
}
@Entity
@Table(name = "BOOK")
public class Book {
// ...
@ManyToOne
@JoinColumn(name="oid", referencedColumnName = "uid")
private User user;
}
EntityManager em;
User user1 = em.find(User.class, 1L);
Book book1 = new Book();
Book book2 = new Book();
user1.addBook(book1);
user1.addBook(book2);
book1.getUser(); // user1
book2.getUser(); // user1
是的,如果你想處理裸 ID
通過 setter 設置另一個用戶。book表中對應的uid會被更新。
book1.setUser(user2);
將導致聲明
update BOOK set oid = 2 where bid = 1;

TA貢獻1911條經驗 獲得超7個贊
為什么我需要在 book 表中為我的 uid 創建一個用戶對象?
您無需對數據庫表進行任何更改。Hibernate 將從 book 表中讀取 oid,并將Book.user使用此 oid 標識的 User 類型的對象填充該字段。
這樣,例如,當您在應用程序中顯示有關一本書的信息時,并且希望顯示所有者的姓名時,您需要做的就是
display(book.getUser().getName());
不必獲取用戶的 ID,然后執行第二個數據庫查詢來獲取用戶。
如果我想訪問所有者的用戶 ID,我應該使用這個:
是的?;蛘吣惶砑尤魏畏椒?,因為任何調用者都可以book.getUser().getUid()自己完成。
如果我想更改書的所有者,我應該怎么做?
假設您擁有新所有者的 uid,您將獲得由此 ID 標識的用戶,并在書上設置:
User newOwner = entityManager.find(User.class, newOwnerId);
// or User newOwner = entityManager.getReference(User.class, newOwnerId);
// depending on what you prefer
book.setUser(newOwner);
關于您對多對一的映射,這是錯誤的。您需要閱讀 Hibernate 手冊和 javadoc,而不是隨意嘗試。它應該只是
@ManyToOne
@JoinColumn(name = "oid")
private User user;
添加回答
舉報