91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hibernate一對多注解怎么實現

發布時間:2022-09-29 15:57:27 來源:億速云 閱讀:145 作者:iii 欄目:開發技術

這篇文章主要介紹“Hibernate一對多注解怎么實現”,在日常操作中,相信很多人在Hibernate一對多注解怎么實現問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Hibernate一對多注解怎么實現”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1. 簡介

使用JPA注釋的一對多映射示例,它是XML的替代方法。

2. 說明

簡單來說,一對多映射就是將一個表中的一行映射到另一個表中的多行。

讓我們看一下下面的實體關系圖,看看一對多的關聯:

Hibernate一對多注解怎么實現

對于此示例,我們將實現一個購物車系統,其中每個購物車都有一個表,每個項目都有另一個表。一個購物車可以有很多物品,所以這里我們有一個一對多的映射。

這在數據庫級別的工作方式是我們有一個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數據庫

3. 設置

(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}

4. 模型

與映射相關的配置將使用模型類中的 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注釋引用映射的列。

5. 在行動

在測試程序中,我們正在創建一個帶有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

6. @ManyToOne注解

正如我們在第 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一對多注解怎么實現”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贵南县| 龙泉市| 铜川市| 华蓥市| 和林格尔县| 海盐县| 崇阳县| 安顺市| 南部县| 辉县市| 班戈县| 枝江市| 江都市| 石家庄市| 芮城县| 苏尼特左旗| 曲阳县| 夏河县| 荥经县| 清苑县| 蓬溪县| 南安市| 汕尾市| 吴忠市| 大城县| 罗山县| 榆林市| 伊通| 青浦区| 屏南县| 栖霞市| 莲花县| 乐平市| 铁力市| 图们市| 铜鼓县| 潜山县| 朝阳市| 贵南县| 萨嘎县| 托克托县|