hibernate多对一和一对多关联
关联,是类的实例之间的关系,表示有意义和值得关注的连接。
多对一单向关联:
单向多对一:<many-to-one>定义一个持久化类与另一个持久化类的关联这种关联是数据表间的多对一关联,需要此持久化类映射表的外键引用另一个持久化类映射表的主键
many-to-one的一些属性:
update:进行update操作时是否包含此字段
insert:进行insert操作时是否包含此字段
update="false" insert="false" 意味着这格ClientChildType 无论何种情况,都不会被Hibernate 更新,新增,只有删除的时候,会影响到 ClientChildType,默认是true
name:映射类属性的名字
column:关联的字段
class:关联类的名字
cascade:设置操作中的级联策略 可选值为 all所有操作情况均进行级联、none所有操作情况均不进行级联、save-update执行save和update操作时级联、delete执行删除操作时级联
fetch:设置抓取数据的策略 默认值为select序列选择抓取 可选值为join外连接抓取
property-ref:指定关联类的一个属性,这个属性将会和本类的外键相对应(当外键参照一键时需要指定改属性)
双向多对一:hibernate既可以通过主控方实体加载被控方实体同时也可以通过被控方实体加载主控方实体。也就是说在单向一对多基础上,在被控方配置与主控方对应的对多一关系
在主键为对方外键表的持久化类中多了一个控方的Set集合
想要在hashset中进行排序的话,只需要在set标签内添加属性order by并赋值即可:
<set name="products" inverse="true" order by="id desc"> <key column="FACTORY"/><one-to-many class="com.hibernate.bean.Product"/></set>
有关sql:
product表与factory表:
create table Product( id int primary key auto_increment, name varchar(200) not null, price double null, factory int , FOREIGN KEY(factory) REFERENCES factory(factoryid) )create table factory( factoryid int primary key auto_increment, factoryname varchar(200) not null )
Factory.java和Product.java与它们的hmb.xml
package com.hibernate.bean;public class Factory {private int factoryid;private String factoryname;public int getFactoryid() {return factoryid;}public void setFactoryid(int factoryid) {this.factoryid = factoryid;}public String getFactoryname() {return factoryname;}public void setFactoryname(String factoryname) {this.factoryname = factoryname;}public Factory(int factoryid, String factoryname) {super();this.factoryid = factoryid;this.factoryname = factoryname;}public Factory(){}}
<class table="FACTORY" name="com.hibernate.bean.Factory" ><id name="factoryid" type="int"><column name="FACTORYID"></column><generator class="identity"></generator></id><property name="factoryname" type="string"><column name="FACTORYNAME"/></property></class>
package com.hibernate.bean;public class Product {private int id;private String name;private double price;private Factory factory;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public Factory getFactory() {return factory;}public void setFactory(Factory factory) {this.factory = factory;}public Product(){}public Product(int id, String name, double price, Factory factory) {super();this.id = id;this.name = name;this.price = price;this.factory = factory;}}
<class table="PRODUCT" name="com.hibernate.bean.Product" ><id name="id" type="int"><column name="ID"></column><generator class="identity"></generator></id><property name="name" type="string"><column name="NAME"/></property><property name="price" type="double"><column name="PRICE"/></property><!--<property name="factory" type="int"><column name="FACTORY"/></property>--><many-to-one name="factory" class="com.hibernate.bean.Factory"><column name="FACTORY"/> </many-to-one></class>
测试:
public static void main(String[] args){Session session=HibernateUtil.getSessionFactory().openSession();session.beginTransaction();Product p=(Product)session.get(Product.class, 1);System.out.println("产品名称:"+p.getName()+"\t"+"产品价格:"+p.getPrice()+"\t"+"生产商:"+p.getFactory().getFactoryname());}
结果:
注意:
在Product.java中的Factory不是数据表中的Factory字段,是一个Factory类对象。
<many-to-one> name属性填写持久化类中的字段名,class属性填写从表对应的持久化类名,相当于<property>中的type属性,<column>中name填写数据表中的对应字段也就是外键的字段
one-to-many:
就是前面的双向配置多对一的与单向的区别部分:
demo:
factory类增加Set的products属性以及其gettersetter方法private Set<Product> products;public void setProducts(Set<Product> products) {this.products = products;}public Set<Product> getProducts() {return products;} ......
<set name="products" inverse="true"> <!--inserse=true意思是改变 该类的该set集合放弃对关联关系的维护权, 改变set中的内容,在factory类中的update和insert操作不影响数据库,个人表示这是正确的,因为在附表中的set集合本来就是虚构的一个字段,所以里面元素的改变不应该影响数据库中的改变--> <key column="FACTORY"/><!--注意:column的值是主表的外键名而不是映射文件对应表的主键名--> <one-to-many class="com.hibernate.bean.Product"/></set>
public static void main(String[] args){Session session=HibernateUtil.getSessionFactory().openSession();Transaction tx=session.beginTransaction();Factory f=(Factory)session.get(Factory.class, 1);System.out.println("编号:"+f.getFactoryid()+"\t名称:"+f.getFactoryname());Set<Product> s=f.getProducts();Iterator<Product> it=s.iterator();System.out.println("该工厂生产的商品:");while(it.hasNext()){Product p=it.next();System.out.println(p.getName()+"\t"+p.getPrice()+"元");}tx.commit();}
结果:
hibernate多对一和一对多关联相关推荐
- Mybatis多对一以及一对多关联映射
前期准备: 建表: CREATE TABLE `teacher` (`id` INT(10) NOT NULL PRIMARY KEY,`name` VARCHAR(30) DEFAULT NULL ...
- Hibernate映射详解(二)--多对一,一对多单向,一对多双向关联映射
在我们以前的数据库设计中,设计表就不是一件轻松的事情.多种事物之间往往都是有这样那样的关系的.那怎样设计表格,才能既将事情描述明白,又能使数据库设计的比较合理呢?那里我们提供了好多规范,好多约束来满足 ...
- 【SSH系列】Hibernate映射 -- 一对多关联映射
映射原理 一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入 ...
- hibernate一对多关联映射
一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端.关联关系都是由多端维护,只是在写映射时发生了变化. 多对一和一对多的区别 多对一和 ...
- (5)hibernate多对一,一对多,一对一,多对多
一 多对一关联 1 映射与原理分析 2 例子结构图 3代码 3.1 Department.java package com.learning;public class Department {priv ...
- 步步为营Hibernate全攻略(二)剪不断理还乱之:一对多关联映射
一对多关联映射和多对一关联映射的原理是一致的,都是在多的一端加入一个外键,指向一的一端.但是他们又有所区别,有了多指向一的关系,在加载多的时候可以将一加载上来,而有了一对多的关系,在加载一的时候可以将 ...
- hibernate单向一对多关联
2019独角兽企业重金招聘Python工程师标准>>> 有这样一个应用场景,有一张用户表(APM_USER),一张部门表(APM_DEPT).用户和部门之间的关系是多对一(many ...
- myeclipse hbm2java_myeclipse试用小记----Hibernate多对一双向关联(2)
myeclipse试用小记----Hibernate多对一双向关联(2) 在上篇文章"myeclipse试用小记----Hibernate多对一单向关联(1)"中,讲到了" ...
- myeclipse试用小记----Hibernate多对一双向关联(2)
myeclipse试用小记----Hibernate多对一双向关联(2) 在上篇文章"myeclipse试用小记----Hibernate多对一单向关联(1)"中,讲到了" ...
最新文章
- php怎样指定主页,如何修改apache指定主页
- Java项目:网上商城系统(java+jsp+servlert+mysql+ajax)
- 放弃鼠标,提高效率——像用Vim一样使用FF
- 【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )
- Python+selenium 自动化-通过窗口名切换窗口,如何获取当前窗口的title窗口名
- 更改已经收货的采购订单价格
- GraphPad Prism 教程,如何在坐标上放置2条生存曲线
- PHP秒杀系统全方位设计分析--转载
- mysql从oracle取数_Oracle通过过程定期取数
- SAP CRM WebClient UI cross workcenter的context cleanup
- ocx控件 postmessage消息会消失_实战经验:如何检测CMFCTabCtrl控件标签页切换事件...
- js 免费语音合成 (百度AI)- 代码篇
- 佳能g2810打印机扫描怎么用_canon g2810驱动下载
- WIFI计量插座之计量芯片选型
- 小米开源文件管理器MiCodeFileExplorer-源码研究(9)-入口分析
- Android 图片文字识别
- 数字信号处理中均值、方差、均方值、均方差计算和它们的物理意义
- URLError: urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify fai
- xpath兄弟结点语法
- 计算机教室报损登记簿,学校实验教学工作总结
热门文章
- 嵌入式linux 试卷,嵌入式Linux模拟试卷
- oracle行列互换sql,解决Oracle行列转换问题的一个方法
- 浪潮服务器5112面板灯_SA5112M4 – IPMI设置
- java微信支付必要参数_微信支付 开发账号体系各参数详解
- activemq中怎么知道推送消息是否成功_如何优雅的使用activeMQ 安装、应用、安全认证、持久化...
- linux写一个ls命令,linux 下 如何自己写 ls 命令
- 顺序表的插入与删除java_C++实现顺序表的常用操作(插入删出查找输出)
- linux右上角不显示网络连接_来体验下Linux吧
- typecho和wordpress模板了解、开发流程介绍、前台后台前端后端区分
- 数据结构之malloc()函数动态内存分配复习