我的编程空间,编程开发者的网络收藏夹
学习永远不晚

hibernate 一对多 关系映射

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

hibernate 一对多  关系映射

在关系中,或多或少的表之间有复杂的关联关系

这里测试 一对多 关联关系的配置


  1. 开发步骤就不多说了。直接看一个示例。


users 用户 和  shop商品订单表

分析:一个用户可以有多个商品订单,一个订单只属于一个用户。

这样就构成了一对多的关联关系。


这里用的是oracle 数据库

users 和 shop 数据库表

create table users(
	id number(7) primary key,
  name nvarchar2(20),
  pass nvarchar2(20),
  address nvarchar2(50)
)

create table shop(
	id number(7) primary key,
  price number(7),
	sh_name nvarchar2(50),
  us_id references users(id)
)


2.users 实体

package com.hib.entity;

import java.util.HashSet;
import java.util.Set;

public class Users {
	private Integer id;
	private String name;
	private String pass;
	private String address;
	
	private Set<Shop> shop = new HashSet<Shop>();

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPass() {
		return pass;
	}

	public void setPass(String pass) {
		this.pass = pass;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public Set<Shop> getShop() {
		return shop;
	}

	public void setShop(Set<Shop> shop) {
		this.shop = shop;
	}

	public Users(Integer id, String name, String pass, String address) {
		super();
		this.id = id;
		this.name = name;
		this.pass = pass;
		this.address = address;
	}

	public Users() {
		super();
	}

	@Override
	public String toString() {
		return "Users [id=" + id + ", name=" + name + ", pass=" + pass + ", address=" + address + "]";
	}

}

shop 实体

package com.hib.entity;

public class Shop {
	
	private Integer id;
	private Integer price;
	private String sh_name;
	
	private Users users;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getSh_name() {
		return sh_name;
	}
	public void setSh_name(String sh_name) {
		this.sh_name = sh_name;
	}
	public Integer getPrice() {
		return price;
	}
	public void setPrice(Integer price) {
		this.price = price;
	}
	
	
	public Users getUsers() {
		return users;
	}
	public void setUsers(Users users) {
		this.users = users;
	}
	
	public Shop(Integer id, String sh_name, Integer price) {
		super();
		this.id = id;
		this.sh_name = sh_name;
		this.price = price;
	}
	
	public Shop() {
		super();
	}
	
	@Override
	public String toString() {
		return "Shop [id=" + id + ", sh_name=" + sh_name + ", price=" + price + "]";
	}
	
}

3.shop.hbm.xml映射文件配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
	
	
	<class name="com.hib.entity.Users" table="users">
		<id name="id">
			<generator class="increment">
			</generator>
		</id>
		
		<property name="name"/>
		<property name="pass"/>
		<property name="address"/>
		
		<!-- 1的一方配置
			 invese: true 不维护关系
		 -->
		<set name="shop" inverse="true" cascade="all">
			<!-- sh_id 是下面多一方的外键表中字段 -->
			<key column="us_id"/>
			<one-to-many class="com.hib.entity.Shop"/>
		</set>
	</class>
	
	<class name="com.hib.entity.Shop" table="shop">
		<id name="id">
			<generator class="increment"></generator>
		</id>
		
		<property name="sh_name"/>
		<property name="price"/>
		
		<many-to-one name="users" class="com.hib.entity.Users" column="us_id" cascade="none"/>
	</class>
</hibernate-mapping>

4. 不要忘记注册。

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
        <property name="hibernate.connection.username">ssh</property>
        <property name="hibernate.connection.password">ssh</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:xe</property>
        
        <!-- 方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
        <!-- 可视化sql -->
        <property name="hibernate.show_sql">true</property>
        <!-- 格式化sql,自动对可视化sql换行,对齐 -->
        <property name="hibernate.format_sql">true</property>
        <!-- 为getCurrentSession添加配置,保证事务中公用义个session -->
       <property name="current_session_context_class">thread</property>
        
        <!-- 注册 -->
        <mapping resource="shop.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

5.测试  级联插入测试

@Test
	public void insert(){
		Session session = HibUtil.getSession();
		Transaction tx = session.beginTransaction();
		
		Users users = new Users(null, "苦力强", "kuliqiang", "zg");
		Shop shop = new Shop(null, "橙子", 2800);
		
		users.getShop().add(shop);
		shop.setUsers(users);
		
		session.save(users);	
		
		tx.commit();
	}

记得要设置级联关系。

测试   查询

@Test
	public void query(){
		Session session = HibUtil.getSession();
		Transaction tx = session.beginTransaction();
		
		Users users = (Users)session.get(Users.class, 1);
		
		for (Shop shop : users.getShop()) {
			System.out.println(shop);
		}
		System.out.println(users);
		tx.commit();
	}



更新和删除就不测试了,更新先查询出来,再修改值,然后更新就可以了。

删除直接查询出来,删除就可以了。


如果是单向的1对多 上面的可以修改为

  1. users 实体不改变

  2. shop 中的 users去掉

  3. 配置文件中 去掉下面这段配置

<many-to-one name="users" class="com.hib.entity.Users" column="us_id" cascade="none"/>

4. 配置文件中 inverse="true" 去掉,告诉主表,来维护从表

<set name="shop" inverse="true" cascade="all">


其他的还是一样操作。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

hibernate 一对多 关系映射

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Hibernate映射一对多关联关系是什么

这篇文章主要讲解了“Hibernate映射一对多关联关系是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Hibernate映射一对多关联关系是什么”吧!在域模型中,类和类之间最普通的关系
2023-06-17

Java Hibernate中一对多和多对多关系的映射方式

Hibernate是一种Java对象关系映射框架,支持一对多和多对多关系的映射。一对多关系可以使用集合属性和单向/双向关联来映射,多对多关系可以使用集合属性和中间表来映射。在映射过程中,需要注意级联操作、延迟加载、中间表的处理等问题
2023-05-18

hibernate中的对象关系映射

Hibernate的本质就是对象关系映射(ObjectRelational Mapping),ORM实现了将对象数据保存到数据库中,以前我们对关系表进行操作,执行增删改查等任务,现在我们不再对关系表进行操作,而是直接对对象操作。hibern
2023-05-31

Hibernate映射之基本类映射和对象关系映射详解

回想一些我们在没有学习ssh的时候,我们建立数据库的表时,首先是数据库建模E-R图,然后再通过实体模型来建立关系模型,再建立相应的表。实体间存在三种关系,一对一,一对多(或者说多对一),多对多。而如今我们要根据类来映射相应的表,那只能是通过
2023-05-31

Hibernate对象关系映射举例分析

本篇内容介绍了“Hibernate对象关系映射举例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!同样由于Hibernate官方文档的影响
2023-06-17

浅谈hibernate中多表映射关系配置

1.one-to-many 一对多关系的映射配置(在一的一方实体映射文件中配置)