您好,登錄后才能下訂單哦!
這篇文章主要介紹“Hibernate一對多注解怎么實現”,在日常操作中,相信很多人在Hibernate一對多注解怎么實現問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Hibernate一對多注解怎么實現”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
使用JPA注釋的一對多映射示例,它是XML的替代方法。
簡單來說,一對多映射就是將一個表中的一行映射到另一個表中的多行。
讓我們看一下下面的實體關系圖,看看一對多的關聯:
對于此示例,我們將實現一個購物車系統,其中每個購物車都有一個表,每個項目都有另一個表。一個購物車可以有很多物品,所以這里我們有一個一對多的映射。
這在數據庫級別的工作方式是我們有一個cart_id作為cart表中的主鍵,還有一個cart_id 作為items中的外鍵 。
我們在代碼中執行此操作的方式是使用@OneToMany。
讓我們 以反映數據庫中關系的方式將Cart類映射到 Item對象的集合:
public class Cart { //... @OneToMany(mappedBy="cart") private Set<Item> items; //...}
我們還可以 使用@ManyToOne在每個 Item中添加對Cart的引用,使其成為 雙向關系。雙向意味著我們能夠訪問 來自購物車的物品,也可以訪問 來自物品的購物車。
mappedBy屬性用于告訴 Hibernate 我們使用哪個變量來表示子類中的父類。
以下技術和庫用于開發實現一對多關聯的示例 Hibernate 應用程序:
JDK 1.8 或更高版本
休眠5
Maven 3 或更高版本
H2數據庫
(1)數據庫設置
我們將使用 Hibernate 從域模型中管理我們的模式。換句話說,我們不需要提供 SQL 語句來創建各種表和實體之間的關系。因此,讓我們繼續創建 Hibernate 示例項目。
(2)Maven 依賴項
讓我們首先將 Hibernate 和 H2 驅動程序依賴項添加到我們的pom.xml文件中。Hibernate 依賴項使用 JBoss 日志記錄,它會自動添加為傳遞依賴項:
休眠版本5.6.7.Final
H2驅動版本2.1.212
請訪問 Maven 中央存儲庫以獲取最新版本的Hibernate和H2依賴項。
(3)休眠會話工廠
接下來,讓我們為我們的數據庫交互創建 Hibernate SessionFactory :
public static SessionFactory getSessionFactory() { ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() .applySettings(dbSettings()) .build(); Metadata metadata = new MetadataSources(serviceRegistry) .addAnnotatedClass(Cart.class) // other domain classes .buildMetadata(); return metadata.buildSessionFactory(); }private static Map<String, String> dbSettings() { // return Hibernate settings}
與映射相關的配置將使用模型類中的 JPA 注釋完成:
請注意,@OneToMany注釋用于定義Item 類中的屬性,該屬性將用于映射mappedBy變量。這就是為什么我們在Item 類中有一個名為“ cart ”的屬性:
@Entity@Table(name="ITEMS")public class Item { //... @ManyToOne @JoinColumn(name="cart_id", nullable=false) private Cart cart; public Item() {} // getters and setters}
同樣重要的是要注意@ManyToOne注釋與Cart類變量相關聯。@JoinColumn注釋引用映射的列。
在測試程序中,我們正在創建一個帶有main () 方法的類,用于獲取 Hibernate Session,并將模型對象保存到實現一對多關聯的數據庫中:
sessionFactory = HibernateAnnotationUtil.getSessionFactory(); session = sessionFactory.getCurrentSession(); System.out.println("Session created"); tx = session.beginTransaction(); session.save(cart); session.save(item1); session.save(item2); tx.commit(); System.out.println("Cart ID=" + cart.getId()); System.out.println("item1 ID=" + item1.getId() + ", Foreign Key Cart ID=" + item.getCart().getId()); System.out.println("item2 ID=" + item2.getId() + ", Foreign Key Cart ID=" + item.getCart().getId());
這是我們測試程序的輸出:
Session created Hibernate: insert into CART values () Hibernate: insert into ITEMS (cart_id) values (?) Hibernate: insert into ITEMS (cart_id) values (?) Cart ID=7item1 ID=11, Foreign Key Cart ID=7item2 ID=12, Foreign Key Cart ID=7Closing SessionFactory
正如我們在第 2 節中看到的,我們可以通過使用@ManyToOne注釋來指定多對一關系。多對一映射意味著該實體的許多實例映射到另一個實體的一個實例——一個購物車中的許多物品。
@ManyToOne注釋也讓我們可以創建雙向關系。我們將在接下來的幾小節中詳細介紹這一點。
(1)不一致和所有權
現在,如果Cart引用了Item,但 Item 又沒有引用Cart,我們的關系將是單向的。這些對象也將具有自然的一致性。
但在我們的例子中,這種關系是雙向的,帶來了不一致的可能性。
讓我們想象這樣一種情況,開發人員想將 item1添加到 cart1 實例,將 item2 添加到 cart2 實例,但是犯了一個錯誤,導致cart2和item2之間的引用變得不一致:
Cart cart1 = new Cart(); Cart cart2 = new Cart(); Item item1 = new Item(cart1); Item item2 = new Item(cart2); Set<Item> itemsSet = new HashSet<Item>(); itemsSet.add(item1); itemsSet.add(item2); cart1.setItems(itemsSet); // wrong!
如上所示,item2引用了 cart2,而cart2 沒有引用item2,這很糟糕。
Hibernate 應該如何將 item2保存到數據庫中?item2外鍵會引用cart1還是cart2?
我們使用關系擁有方的想法來解決這種歧義;屬于擁有方的引用優先并保存到數據庫中。
(2)物品作為擁有方
正如JPA 規范第 2.9 節中所述,將多對一方標記為擁有方是一種很好的做法 。
換句話說,我將是擁有方,而Cart是 反方,這正是我們之前所做的。
那么我們是如何做到這一點的呢?
通過在Cart類中包含mappedBy屬性,我們將其標記為反面。
同時,我們還對Item進行了注解。帶有@ManyToOne的購物車字段,使 Item 成為擁有方。
回到我們的“不一致”示例,現在 Hibernate 知道item2的引用更重要,并將 item2的引用保存到數據庫。
讓我們檢查一下結果:
item1 ID=1, Foreign Key Cart ID=1item2 ID=2, Foreign Key Cart ID=2
盡管cart在我們的代碼片段中 引用了item2 ,但 item2 對 cart2的引用保存在數據庫中。
(3)購物車作為擁有方
也可以將 一對多的一方標記為擁有方,將 多對一的一方標記為反方。
雖然這不是推薦的做法,但讓我們繼續嘗試一下。
下面的代碼片段顯示了 一對多端作為擁有端的實現:
public class ItemOIO { // ... @ManyToOne @JoinColumn(name = "cart_id", insertable = false, updatable = false) private CartOIO cart; //..}public class CartOIO { //.. @OneToMany @JoinColumn(name = "cart_id") // we need to duplicate the physical information private Set<ItemOIO> items; //..}
請注意我們如何刪除mappedBy元素并將多對一@JoinColumn 設置為可插入且可更新為false。
如果我們運行相同的代碼,結果將相反:
item1 ID=1, Foreign Key Cart ID=1item2 ID=2, Foreign Key Cart ID=1
如上所示,現在item2屬于 購物車。
到此,關于“Hibernate一對多注解怎么實現”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。