Hibernate一对多映射示例注释

今天我们将研究Hibernate中的One To Many Mapping。我们将使用Annotation和XML配置来研究Hibernate One To Many Mapping示例。

目录[ 隐藏 ]

  • 1 Hibernate中的一对多映射

    • 1.1 Hibernate中的一对多映射 - 数据库设置
    • 1.2 Hibernate一对多映射项目结构
    • 1.3 Hibernate Maven依赖项
    • 1.4 Hibernate一对多映射模型类
    • 1.5 Hibernate SessionFactory实用工具类
    • 1.6 Hibernate配置XML文件
    • 1.7 Hibernate一对多映射示例 - XML配置
    • 1.8 Hibernate一对多映射示例 - 测试程序
  • 2 Hibernate一对多映射注释
    • 2.1 Hibernate一对多映射示例注释
    • 2.2 Hibernate SessionFactory实用工具类
    • 2.3 Hibernate一对多映射注释模型类
    • 2.4 Hibernate一对多映射注释示例测试程序

Hibernate中的一对多映射

简单来说,一对多映射意味着表中的一行可以映射到另一个表中的多行。例如,考虑一个Cart系统,其中我们有另一个Items表。购物车可以有多个商品,所以这里我们有一对多的映射。我们将使用Cart-Items场景来处理我们的hibernate一对多映射示例。

Hibernate中的一对多映射 - 数据库设置

我们可以使用外键约束进行一对多映射。下面是我们的数据库脚本CartItems表。我正在使用MySQL数据库进行Hibernate一对多的映射示例。

setup.sql


CREATE TABLE `Cart` (`cart_id` int(11) unsigned NOT NULL AUTO_INCREMENT,`total` decimal(10,0) NOT NULL,`name` varchar(10) DEFAULT NULL,PRIMARY KEY (`cart_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;CREATE TABLE `Items` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`cart_id` int(11) unsigned NOT NULL,`item_id` varchar(10) NOT NULL,`item_total` decimal(10,0) NOT NULL,`quantity` int(3) NOT NULL,PRIMARY KEY (`id`),KEY `cart_id` (`cart_id`),CONSTRAINT `items_ibfk_1` FOREIGN KEY (`cart_id`) REFERENCES `Cart` (`cart_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

下面是Cart和Items表的ER图。

我们的数据库设置准备就绪,让我们继续创建hibernate One to Many Mapping示例项目。首先,我们将使用基于XML的配置,然后我们将使用Hibernate和JPA注释实现一对多映射。

Hibernate一对多映射项目结构

在Eclipse或您最喜欢的IDE中创建一个简单的Maven项目,最终的项目结构将如下图所示。

Hibernate Maven依赖项

我们的最终pom.xml文件包含Hibernate和MySQL驱动程序的依赖项。Hibernate使用JBoss日志记录,它会自动添加为传递依赖项。


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.journaldev.hibernate</groupId><artifactId>HibernateOneToManyMapping</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>4.3.5.Final</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.0.5</version></dependency></dependencies></project>

请注意,我使用最新的Hibernate版本4.3.5.Final和MySQL驱动程序版本基于我的数据库安装。

Hibernate一对多映射模型类

对于我们的表Cart和Items,我们有模型类来反映它们。

Cart.java


package com.journaldev.hibernate.model;import java.util.Set;public class Cart {private long id;private double total;private String name;private Set<Items> items;public long getId() {return id;}public void setId(long id) {this.id = id;}public double getTotal() {return total;}public void setTotal(double total) {this.total = total;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Set<Items> getItems() {return items;}public void setItems(Set<Items> items) {this.items = items;}}

我正在使用Set of Items,因此每条记录都是唯一的。我们还可以在hibernate中使用List或Array进行一对多映射。

Items.java


package com.journaldev.hibernate.model;public class Items {private long id;private String itemId;private double itemTotal;private int quantity;private Cart cart;//Hibernate requires no-args constructorpublic Items(){}public Items(String itemId, double total, int qty, Cart c){this.itemId=itemId;this.itemTotal=total;this.quantity=qty;this.cart=c;}public String getItemId() {return itemId;}public void setItemId(String itemId) {this.itemId = itemId;}public double getItemTotal() {return itemTotal;}public void setItemTotal(double itemTotal) {this.itemTotal = itemTotal;}public int getQuantity() {return quantity;}public void setQuantity(int quantity) {this.quantity = quantity;}public Cart getCart() {return cart;}public void setCart(Cart cart) {this.cart = cart;}public long getId() {return id;}public void setId(long id) {this.id = id;}}

项目与Cart有多对一的关系,因此我们不需要具有Collection for Cart对象。

Hibernate SessionFactory实用工具类

我们有一个用于创建Hibernate SessionFactory的实用程序类。

HibernateUtil.java


package com.journaldev.hibernate.util;import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;public class HibernateUtil {private static SessionFactory sessionFactory;private static SessionFactory buildSessionFactory() {try {// Create the SessionFactory from hibernate.cfg.xmlConfiguration configuration = new Configuration();configuration.configure("hibernate.cfg.xml");System.out.println("Hibernate Configuration loaded");ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();System.out.println("Hibernate serviceRegistry created");SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);return sessionFactory;}catch (Throwable ex) {System.err.println("Initial SessionFactory creation failed." + ex);ex.printStackTrace();throw new ExceptionInInitializerError(ex);}}public static SessionFactory getSessionFactory() {if(sessionFactory == null) sessionFactory = buildSessionFactory();return sessionFactory;}
}

Hibernate配置XML文件

我们的hibernate配置xml文件包含数据库信息和映射资源详细信息。

hibernate.cfg.xml


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration><session-factory><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.password">pankaj123</property><property name="hibernate.connection.url">jdbc:mysql://localhost/TestDB</property><property name="hibernate.connection.username">pankaj</property><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><property name="hibernate.current_session_context_class">thread</property><property name="hibernate.show_sql">true</property><mapping resource="cart.hbm.xml"/><mapping resource="items.hbm.xml"/></session-factory>
</hibernate-configuration>

Hibernate一对多映射示例 - XML配置

这是教程中最重要的部分,让我们看看我们如何在hibernate中为一对多映射映射Cart和Items类。

cart.hbm.xml


<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="com.journaldev.hibernate.model"><class name="Cart" table="CART" ><id name="id" type="long"><column name="cart_id" /><generator class="identity" /></id><property name="total" type="double"><column name="total" /></property><property name="name" type="string"><column name="name" /></property><set name="items" table="ITEMS" fetch="select"><key><column name="cart_id" not-null="true"></column></key><one-to-many class="Items"/></set></class></hibernate-mapping>

重要的部分是其中的set元素和one-to-many元素。请注意,我们提供的密钥用于一对多映射,即cart_id。

items.hbm.xml


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.org/dtd/hibernate-mapping-3.0.dtd" ><hibernate-mapping package="com.journaldev.hibernate.model"><class name="Items" table="ITEMS"><id name="id" type="long"><column name="id" /><generator class="identity" /></id><property name="itemId" type="string"><column name="item_id"></column></property><property name="itemTotal" type="double"><column name="item_total"></column></property><property name="quantity" type="integer"><column name="quantity"></column></property><many-to-one name="cart" class="Cart"><column name="cart_id" not-null="true"></column></many-to-one></class></hibernate-mapping>

请注意,从项目到购物车,它是多对一的关系。因此我们需要使用many-to-onecart for cart,我们提供将使用键映射的列名。因此基于Cart hibernate映射配置,它的关键cart_id将用于映射。

我们使用XML映射的Hibernate一对多映射示例项目已准备就绪,让我们编写一个测试程序并检查它是否正常工作。

Hibernate一对多映射示例 - 测试程序

HibernateOneToManyMain.java


package com.journaldev.hibernate.main;import java.util.HashSet;
import java.util.Set;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;import com.journaldev.hibernate.model.Cart;
import com.journaldev.hibernate.model.Items;
import com.journaldev.hibernate.util.HibernateUtil;public class HibernateOneToManyMain {public static void main(String[] args) {Cart cart = new Cart();cart.setName("MyCart");Items item1 = new Items("I1", 10, 1, cart);Items item2 = new Items("I2", 20, 2, cart);Set<Items> itemsSet = new HashSet<Items>();itemsSet.add(item1); itemsSet.add(item2);cart.setItems(itemsSet);cart.setTotal(10*1 + 20*2);SessionFactory sessionFactory = null;Session session = null;Transaction tx = null;try{//Get SessionsessionFactory = HibernateUtil.getSessionFactory();session = sessionFactory.getCurrentSession();System.out.println("Session created");//start transactiontx = session.beginTransaction();//Save the Model objectssession.save(cart);session.save(item1);session.save(item2);//Commit transactiontx.commit();System.out.println("Cart ID="+cart.getId());}catch(Exception e){System.out.println("Exception occured. "+e.getMessage());e.printStackTrace();}finally{if(!sessionFactory.isClosed()){System.out.println("Closing SessionFactory");sessionFactory.close();}}}}

请注意,我们需要逐个保存Cart和Items对象。Hibernate将负责更​​新Items表中的外键。当我们执行上面的程序时,我们得到以下输出。


Hibernate Configuration loaded
Hibernate serviceRegistry created
Session created
Hibernate: insert into CART (total, name) values (?, ?)
Hibernate: insert into ITEMS (item_id, item_total, quantity, cart_id) values (?, ?, ?, ?)
Hibernate: insert into ITEMS (item_id, item_total, quantity, cart_id) values (?, ?, ?, ?)
Hibernate: update ITEMS set cart_id=? where id=?
Hibernate: update ITEMS set cart_id=? where id=?
Cart ID=6
Closing SessionFactory

请注意,Hibernate使用Update查询在ITEMS表中设置cart_id。

Hibernate一对多映射注释

现在我们已经看到了如何使用基于XML的配置在Hibernate中实现One To Many映射,让我们看看如何使用JPA注释做同样的事情。

Hibernate一对多映射示例注释

Hibernate配置文件几乎相同,只是因为我们使用Classes进行hibernate使用注释进行一对多映射,所以映射元素会发生变化。

hibernate-annotation.cfg.xml


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration><session-factory><property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property><property name="hibernate.connection.password">pankaj123</property><property name="hibernate.connection.url">jdbc:mysql://localhost/TestDB</property><property name="hibernate.connection.username">pankaj</property><property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property><property name="hibernate.current_session_context_class">thread</property><property name="hibernate.show_sql">true</property><mapping class="com.journaldev.hibernate.model.Cart1"/><mapping class="com.journaldev.hibernate.model.Items1"/></session-factory>
</hibernate-configuration>

Hibernate SessionFactory实用工具类

SessionFactory实用程序类几乎相同,我们只需要使用新的hibernate配置文件。

HibernateAnnotationUtil.java


package com.journaldev.hibernate.util;import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;public class HibernateAnnotationUtil {private static SessionFactory sessionFactory;private static SessionFactory buildSessionFactory() {try {// Create the SessionFactory from hibernate-annotation.cfg.xmlConfiguration configuration = new Configuration();configuration.configure("hibernate-annotation.cfg.xml");System.out.println("Hibernate Annotation Configuration loaded");ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();System.out.println("Hibernate Annotation serviceRegistry created");SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry);return sessionFactory;}catch (Throwable ex) {System.err.println("Initial SessionFactory creation failed." + ex);ex.printStackTrace();throw new ExceptionInInitializerError(ex);}}public static SessionFactory getSessionFactory() {if(sessionFactory == null) sessionFactory = buildSessionFactory();return sessionFactory;}
}

Hibernate一对多映射注释模型类

由于我们没有基于xml的映射文件,因此所有与映射相关的配置都将使用模型类中的JPA注释完成。如果您了解基于xml的映射,则它非常简单且类似。

Cart1.java


package com.journaldev.hibernate.model;import java.util.Set;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;@Entity
@Table(name="CART")
public class Cart1 {@Id@GeneratedValue(strategy=GenerationType.IDENTITY)@Column(name="cart_id")private long id;@Column(name="total")private double total;@Column(name="name")private String name;@OneToMany(mappedBy="cart1")private Set<Items1> items1;// Getter Setter methods for properties
}

需要注意的重点是OneToMany注释,其中mappedBy变量用于定义Items1将用于映射目的的类中的属性。所以我们应该在Items1类中有一个名为“cart1”的属性。不要忘记包含所有getter-setter方法。

Items1.java


package com.journaldev.hibernate.model;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;@Entity
@Table(name="ITEMS")
public class Items1 {@Id@GeneratedValue(strategy=GenerationType.IDENTITY)@Column(name="id")private long id;@Column(name="item_id")private String itemId;@Column(name="item_total")private double itemTotal;@Column(name="quantity")private int quantity;@ManyToOne@JoinColumn(name="cart_id", nullable=false)private Cart1 cart1;//Hibernate requires no-args constructorpublic Items1(){}public Items1(String itemId, double total, int qty, Cart1 c){this.itemId=itemId;this.itemTotal=total;this.quantity=qty;this.cart1=c;}
//Getter Setter methods
}

上面类中最重要的一点是ManyToOneCart1类变量和JoinColumn注释的注释,以提供映射的列名。

这就是使用模型类中的注释在hibernate中进行一对多映射。将它与基于XML的配置进行比较,您会发现它们非常相似。

让我们编写一个测试程序并执行它。

Hibernate一对多映射注释示例测试程序

Our test program is just like xml based configuration, we are just using the new classes for getting Hibernate Session and saving the model objects into database.

HibernateOneToManyAnnotationMain.java


package com.journaldev.hibernate.main;import java.util.HashSet;
import java.util.Set;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;import com.journaldev.hibernate.model.Cart1;
import com.journaldev.hibernate.model.Items1;
import com.journaldev.hibernate.util.HibernateAnnotationUtil;public class HibernateOneToManyAnnotationMain {public static void main(String[] args) {Cart1 cart = new Cart1();cart.setName("MyCart1");Items1 item1 = new Items1("I10", 10, 1, cart);Items1 item2 = new Items1("I20", 20, 2, cart);Set<Items1> itemsSet = new HashSet<Items1>();itemsSet.add(item1); itemsSet.add(item2);cart.setItems1(itemsSet);cart.setTotal(10*1 + 20*2);SessionFactory sessionFactory = null;Session session = null;Transaction tx = null;try{//Get SessionsessionFactory = HibernateAnnotationUtil.getSessionFactory();session = sessionFactory.getCurrentSession();System.out.println("Session created");//start transactiontx = session.beginTransaction();//Save the Model objectsession.save(cart);session.save(item1);session.save(item2);//Commit transactiontx.commit();System.out.println("Cart1 ID="+cart.getId());System.out.println("item1 ID="+item1.getId()+", Foreign Key Cart ID="+item1.getCart1().getId());System.out.println("item2 ID="+item2.getId()+", Foreign Key Cart ID="+item1.getCart1().getId());}catch(Exception e){System.out.println("Exception occured. "+e.getMessage());e.printStackTrace();}finally{if(!sessionFactory.isClosed()){System.out.println("Closing SessionFactory");sessionFactory.close();}}}}

When we execute above hibernate one to many mapping annotation example test program, we get following output.


Hibernate Annotation Configuration loaded
Hibernate Annotation serviceRegistry created
Session created
Hibernate: insert into CART (name, total) values (?, ?)
Hibernate: insert into ITEMS (cart_id, item_id, item_total, quantity) values (?, ?, ?, ?)
Hibernate: insert into ITEMS (cart_id, item_id, item_total, quantity) values (?, ?, ?, ?)
Cart1 ID=7
item1 ID=9, Foreign Key Cart ID=7
item2 ID=10, Foreign Key Cart ID=7
Closing SessionFactory

本文即是关于hibernate的一对多映射的教程,从下面的链接下载示例项目并进行更多实验。

下载Hibernate OneToMany Mapping项目

转载来源:https://www.journaldev.com/2924/hibernate-one-to-many-mapping-annotation

Hibernate一对多映射示例注释相关推荐

  1. hibernate注释映射_Hibernate一对多映射示例注释

    hibernate注释映射 Today we will look into One To Many Mapping in Hibernate. We will look into Hibernate ...

  2. Hibernate一对一映射示例注释

    Hibernate一对一映射示例注释 今天我们将研究Hibernate中的一对一映射.我们将使用Annotation和XML配置来研究Hibernate One To One Mapping示例. 目 ...

  3. hibernate注释映射_Hibernate一对一映射示例注释

    hibernate注释映射 Today we will look into One to One Mapping in Hibernate. We will look into Hibernate O ...

  4. mvc crud_Spring MVC3 Hibernate CRUD示例应用程序

    mvc crud 学习从HelloWorld应用程序开始的任何Web框架都是一个好主意. 一旦我们熟悉了框架配置,最好做一个CRUD(创建,读取,更新,删除)应用程序,该应用程序涵盖Web框架的各个方 ...

  5. Spring MVC3 Hibernate CRUD示例应用程序

    学习从HelloWorld应用程序开始的任何Web框架都是一个好主意. 一旦我们熟悉了框架配置,最好做一个CRUD(创建,读取,更新,删除)应用程序,该应用程序涵盖Web框架的各个方面,例如验证,请求 ...

  6. HQL - Hibernate查询语言 - 示例教程

    HQL - Hibernate查询语言 - 示例教程 HQL或Hibernate查询语言是Hibernate Framework的面向对象查询语言.HQL与SQL非常相似,只是我们使用Objects而 ...

  7. Spring Hibernate集成示例教程

    Spring Hibernate集成示例教程(Spring 4 + Hibernate 3和Hibernate 4) Spring是最常用的Java EE Framework之一,而Hibernate ...

  8. Struts2 Hibernate集成示例教程

    Struts2 Hibernate集成示例教程 Struts2和Hibernate都是各自领域中广泛使用的框架.今天我们将学习如何将Struts2 Web应用程序框架与Hibernate ORM框架集 ...

  9. JSF Spring Hibernate集成示例教程

    JSF Spring Hibernate集成示例教程 欢迎使用JSF Spring Hibernate Integration示例教程.在上一篇教程中,我们了解了如何将JSF和Spring框架集成在一 ...

最新文章

  1. 教你一步一步用C语言实现sift算法、上
  2. Apache Kafka:大数据的实时处理时代
  3. linux svn强制注释,svn强制提交时添加注释
  4. JSON Web Tokens(JWT)
  5. PHP简单操作Excel
  6. AUTOSAR从入门到精通100讲(八十一)-AUTOSAR基础篇之FiM
  7. logback 配置
  8. Spark分区详解!DT大数据梦工厂王家林老师亲自讲解!
  9. pytorch项目源码理解
  10. mysql 6位随机数_MySQL生成固定位数的随机数
  11. Python安装pandas模块
  12. 计算机基础表格函数基础知识大全,计算机基础-EXCEL公式和函数
  13. 南开计算机等级,南开100题分类-全国计算机等级考试上机考试习题集(二级C)(南开大学出版社)...
  14. 前端数据可视化插件(四)关系图
  15. 3000元台式电脑组装配置单2021 3000元组装电脑配置清单
  16. 部分网页无法打开/修复上网问题的终极方法
  17. 美国合同法笔记-合同定义
  18. 你可能不知道微软悄悄关闭Win10分页显示程序的Sets功能
  19. 520,期待了不起的对象
  20. Mybatis错误Illegal overloaded gette

热门文章

  1. 【漫画详解】用iframe障眼法,骗取用户点击
  2. 一维数组的初始化问题(函数体内与函数体外)
  3. 【AI视野·今日Robot 机器人论文速览 第三十一期】Fri, 15 Apr 2022
  4. 【今日CS 视觉论文速览】Wed, 16 Jan 2019
  5. 华科10年计算机考研复试笔试(算法基础)(1)
  6. 数组算法 java 115918581
  7. 浮动元素与兄弟之间的关系 速记 1211
  8. 前端开发 元素的浮动 文字环饶效果 横向排列效果 0229
  9. python-函数的参数-位置参数-关键词参数
  10. javascript-字典形态对象与数组形态对象