hibernate关系映射
多对一:比如多个订单对应同一个用户,需要在订单表中添加一个用户的属性
订单类:
private Integer orderId;
private Date createTime;
private User user;
用户类:
private int userId;
private String userName;
private String userPsw;
一的方配置xml(user):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="ni.jun.yang.bean.User" table="t_user">
<id name="userId">
<!-- 主键自动增长 -->
<generator class="native"></generator>
</id>
<property name="userName"></property>
<property name="userPsw"></property>
</class>
</hibernate-mapping>
多的一方配置xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="ni.jun.yang.bean.Orders" table="t_order">
<id name="orderId" column="orderId">
<generator class="native"></generator>
</id>
<property name="createTime" type="date"></property> <!-- 多个订单对应一个用户,配置多对一的映射 cascade级联-->
<many-to-one name="user" class="ni.jun.yang.bean.User" column="userId" cascade="all">
</many-to-one>
</class>
</hibernate-mapping>
<many-to-one name="user" class="ni.jun.yang.bean.User" column="userId" cascade="all">
name:类中的成员变量名字
class:对应类的全路径,配了包名只需要写类名即可
column:数据库里面的字段名字
cascade:级联 其值有“all”,“save-update”,“delete”等 测试代码:由于配置级联 cascade=‘all’,保存订单会首先自动保存级联的用户对象
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction ts = session.beginTransaction();
User user = new User();
user.setUserName("不知3");
user.setUserPsw("4563"); Orders orders1 =new Orders();
orders1.setCreateTime(new Date());
orders1.setUser(user); session.save(orders1);
ts.commit();
session.close();
一对多:比如一个人可以有多张银行卡
一的一方需要设置一个 集合来存放多的一方 使用list 或者set集合,一般多用set集合
如:一个人有多个地址,list集合存放
private List<String> addresses;
xml配置:list用list标签,要配置索引 list-index
<list name="addresses" table="address">
<key column="customerId"></key>
<!-- 用list需要配list索引,相当于下标从0开始 -->
<list-index column="ListIndex"></list-index>
<element type="string" column="addressName"></element>
</list>
set集合存放:
private Set<String> addresses;
xml配置:set用set标签
<set name="addresses" table="address" sort="natural">
<key column="customerId"></key>
<element type="string" column="addressName"></element>
</set>
双向一对多:如一个人有多套房,他就有多个地址
customer:
private Integer customerId;
private String customerName;
private Set<Address> adresses;
address:
private Customer customer;
private Integer addressId;
private String address;
customer xml配置:
<!-- inverse=true 放弃关联关系维护,默认false,关系维护-->
<set name="adresses" table="_Address" inverse="true" cascade="save-update">
<key column="customerId"></key>
<one-to-many class="ni.jun.yang.bean.Address" />
</set>
address xml配置
<many-to-one name="customer" class="Customer" column="customerId"></many-to-one>
测试代码:
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction ts = session.beginTransaction();
Address address1 = new Address();
address1.setAddress("青羊区");
Address address2 = new Address();
address2.setAddress("武侯区");
Set<Address> set = new HashSet<Address>();
set.add(address1);
set.add(address2); Customer customer = new Customer();
customer.setCustomerName("zhubajie");
customer.setAdresses(set);
session.save(customer);
ts.commit();
session.close();
多对多,需要第三张表来建立关联关系,必须有一方放弃关联关系维护
类里面两边互相有对方作为成员变量
items:
private Set<Orders> orders=new HashSet<Orders>();
orders:
private Set<Items> items = new HashSet<>();
xml配置里面要设置第三张表来关联:orders_r_items 第三张表
items xml:
<set name="orders" table="orders_r_items">
<key column="itemsId"></key>
<many-to-many class="Orders" column="orderId"></many-to-many>
</set>
orders xml:
<!-- items的集合 多对多,必须有一方放弃关联关系维护 -->
<set name="items" table="orders_r_items" inverse="true">
<key column="orderId"></key>
<many-to-many class="Items" column="itemsId"></many-to-many>
</set>
测试代码:
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction(); Items item = new Items();
item.setPrice(new Double(100));
Items item1 = new Items();
item1.setPrice(new Double(200)); Orders o = new Orders();
o.setCreateTime(new Date());
Orders o1 = new Orders();
o1.setCreateTime(new Date()); o.getItems().add(item);
o.getItems().add(item1); o1.getItems().add(item);
o1.getItems().add(item1); item.getOrders().add(o);
item.getOrders().add(o1); item1.getOrders().add(o);
item1.getOrders().add(o1); session.save(item);
session.save(item1); session.save(o);
session.save(o1); tx.commit();
session.close();
hibernate关系映射的更多相关文章
- Hibernate学习笔记-Hibernate关系映射
1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1( ...
- 【SSH 基础】浅谈Hibernate关系映射(4)
继上篇博客 多对多关联映射(单向) 多对多对象关系映射,须要增加一张新表完毕基本映射. Hibernate会自己主动生成中间表 Hibernate使用many-to-many标签来表示多对多的关联,多 ...
- web进修之—Hibernate 关系映射(3)
概述 Hibernate的关系映射是Hibernate使用的难点或者是重点(别担心,不考试哦~),按照不同的分类方式可以对这些映射关系做一个分类,如: 按对象对应关系分: 一对一 多对一/一对多 多对 ...
- Hibernate关系映射时出现的问题
在学习Hibernate框架的关系映射时,遇到了一个问题: INFO: HHH000422: Disabling contextual LOB creation as connection was n ...
- Hibernate关系映射之many-to-many
1.建表 2.创建实体类及映射文件 Student.java类 public class Student implements java.io.Serializable { // Fields pri ...
- Hibernate关系映射(注解)
1.类级别注解 @Entity 映射实体类 @Table 映射数句库表 @Entity(name="tableName") - 必须,注解将一个类声明为一个实体bea ...
- Hibernate关系映射(三) 多对多
一.使用用户User和Role实现多对多的示例 User.java,实现对Role的引用 package com.lxit.entity; import java.util.HashSet; impo ...
- Hibernate关系映射(三) 多对一和一对多
一.多对一 学生Student和班级Grade实现多对一,多个学生对应一个班级. Student.java实体类,映射了班级的属性. package com.lxit.entity; import j ...
- Hibernate关系映射(二) 基于外键的双向一对一
基于外键的双向一对一关联映射 需要在一端添加<one-to-one>标签,用property-ref来指定反向属性引用. 还是通过刚才用户和地址来演示双向一对一关联. 代码演示 一.实体类 ...
随机推荐
- linux下将eclipse项目转换为gradle项目
本文针对于在linux环境下,不使用eclipse而把一个eclipse项目转换为gradle默认结构的项目的情况,脚本可能在mac下也适用,未验证. windows中的转换问题,以及使用eclips ...
- C# /VB.NET 插入、修改、删除Word批注
批注内容可以是对某段文字或内容的注释,也可以是对文段中心思想的概括提要,或者是对文章内容的评判.疑问,以及在阅读时给自己或他人起到提示作用.本篇文章中将介绍如何在C#中操作Word批注,主要包含以下要 ...
- 一种WPF在后台线程更新UI界面的简便方法
WPF框架规定只有UI线程(主线程)可以更新界面,所有其他后台线程无法直接更新界面.幸好,WPF提供的SynchronizationContext类以及C#的Lambda表达式提供了一种方便的解决方法 ...
- JVM如何理解Java泛型类
//泛型代码 public class Pair<T>{ private T first=null; private T second=null; public Pair(T fir,T ...
- vue项目通过webpack打包生成的dist文件放到express环境里运行(vue+webpack+express)
1.首先需要的原料肯定是vue打包生成的dist文件 在vue项目目录下运行:npm run build,等待运行结束,会在项目目录下生成一个dist文件夹,里面会生成一些文件(如下图示) 小的项目文 ...
- C++string函数之strcpy_s
strcpy_s和strcpy()函数的功能几乎是一样的.strcpy函数,就象gets函数一样,它没有方法来保证有效的缓冲区尺寸,所以它只能假定缓冲足够大来容纳要拷贝的字符串.在程序运行时,这将导致 ...
- 神奇的namespace使用
一大波概念正在来袭: 作用域与命名空间 相关概念 与命名空间相关的概念有: 声明域(declaration region)—— 声明标识符的区域.如在函数外面声明的全局变量,它的声明域为 ...
- 基于Python的数据分析(2):字符串编码
在上一篇文章<基于Python的数据分析(1):配置安装环境>中的第四个步骤中我们在python的启动步骤中强制要求加载sitecustomize.py文件并设置其默认编码为"u ...
- Zookeeper + Dubbo + SpringMVC + dubbo-admin
第一步:在CentOS/Windows上安装Zookeeper[前提] A:CentOS Zookeeper作为Dubbo服务的注册中心,Dubbo原先基于数据库的注册中心,没采用Zookee ...
- Java 核心卷学习笔记(一)
Java基程序设计结构 1.注释 三种注释方式: // 注释单行 /* 内容 */ 注释单行 /** * 内容 */