------------------------Hibernate多对一ManytoOne
要点:
ManytoOne配置在多端
可以配置级联操作 @ManyToOne(cascade=CascadeType.ALL) 实体: @Entity
public class Person {//一端 @Id
@GeneratedValue
private long id; @Column(name="name")
private String name; public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
} @Entity
public class Phone {//多端 @Id
@GeneratedValue
private Long id;
@Column(name="number")
private String number; @ManyToOne
private Person p; public Person getP() {
return p;
}
public void setP(Person p) {
this.p = p;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
} 实例1:只在多端配置映射,只保存一端
Person p = new Person();
p.setName("zhangsan"); Phone ph1 = new Phone();
Phone ph2 = new Phone();
ph1.setNumber("13109361111");
ph2.setNumber("13109362222"); ph1.setP(p);
ph2.setP(p); session.save(p); 结果:
Hibernate:
insert
into
Person
(name, id)
values
(?, ?)
只保存了Person为张三的对象。因为Person端无映射,且为瞬时态对象,直接持久化Person。 实例2.只在多端配置映射,只保存多端
Person p = new Person();
p.setName("zhangsan"); Phone ph1 = new Phone();
Phone ph2 = new Phone();
ph1.setNumber("13109361111");
ph2.setNumber("13109362222"); ph1.setP(p);
ph2.setP(p); session.save(ph1);
session.save(ph2); 结果:[org.hibernate.TransientObjectException: object references an unsaved transient instance
Hibernate抛出异常:Phone对象引用了未持久化瞬时态的Person对象。
因为没有做级联。 实例3.只在多端配置映射,先保存一端,再保存多端
Person p = new Person();
p.setName("zhangsan"); Phone ph1 = new Phone();
Phone ph2 = new Phone();
ph1.setNumber("13109361111");
ph2.setNumber("13109362222"); ph1.setP(p);
ph2.setP(p); session.save(p);
session.save(ph1);
session.save(ph2); 结果:
Hibernate:
insert
into
Person
(name, id)
values
(?, ?)
Hibernate:
insert
into
Phone
(number, p_id, id)
values
(?, ?, ?)
Hibernate:
insert
into
Phone
(number, p_id, id)
values
(?, ?, ?)
先持久化person,再持久化Phone,外键关联正确,执行结果完美。 实例4.只在多端配置映射,先保存多端,再保存一端
Person p = new Person();
p.setName("zhangsan"); Phone ph1 = new Phone();
Phone ph2 = new Phone();
ph1.setNumber("13109361111");
ph2.setNumber("13109362222"); ph1.setP(p);
ph2.setP(p); session.save(ph1);
session.save(ph2);
session.save(p); 结果:
Hibernate:
insert
into
Phone
(number, p_id, id)
values
(?, ?, ?)
Hibernate:
insert
into
Phone
(number, p_id, id)
values
(?, ?, ?)
Hibernate:
insert
into
Person
(name, id)
values
(?, ?)
Hibernate:
update
Phone
set
number=?,
p_id=?
where
id=?
Hibernate:
update
Phone
set
number=?,
p_id=?
where
id=?
先保存ph1,ph2,然后保存了person,最后将外键更新至ph1,ph2。执行了5条sql,有点浪费资源。
因为保存ph1,ph2时person还未保存,所以ph1和ph2的外键为null。最后保存了person后再更新外键。
当设置关联为@ManyToOne(optional=false)外键不许为空时,则抛出异常,因为保存ph1,ph2时外键为null。 ---------------在多端设置级联
要点:设置级联后,可以只保存多端,而不保存一端。持久化操作进行了传递即级联 @Entity
public class Phone { @Id
@GeneratedValue
private Long id;
@Column(name="number")
private String number; @ManyToOne(cascade=CascadeType.ALL)//多对一,设置级联
private Person p; public Person getP() {
return p;
}
public void setP(Person p) {
this.p = p;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
} } 实例5:只在多端配置映射并且设置级联,只保存一端
Person p = new Person();
p.setName("zhangsan"); Phone ph1 = new Phone();
Phone ph2 = new Phone();
ph1.setNumber("13109361111");
ph2.setNumber("13109362222"); ph1.setP(p);
ph2.setP(p); session.save(p);
结果:
Hibernate:
insert
into
Person
(name, id)
values
(?, ?) 实例6.只在多端配置映射并且设置级联,只保存多端
Person p = new Person();
p.setName("zhangsan"); Phone ph1 = new Phone();
Phone ph2 = new Phone();
ph1.setNumber("13109361111");
ph2.setNumber("13109362222"); ph1.setP(p);
ph2.setP(p); session.save(ph1);
session.save(ph2); 结果:Hibernate:
insert
into
Person
(name, id)
values
(?, ?)
Hibernate:
insert
into
Phone
(number, p_id, id)
values
(?, ?, ?)
Hibernate:
insert
into
Phone
(number, p_id, id)
values
(?, ?, ?) 先保存person,再保存phone,执行3条sql语句,运行结果完美 实例7.只在多端配置映射并且设置级联,先保存一端,再保存多端
Person p = new Person();
p.setName("zhangsan"); Phone ph1 = new Phone();
Phone ph2 = new Phone();
ph1.setNumber("13109361111");
ph2.setNumber("13109362222"); ph1.setP(p);
ph2.setP(p); session.save(p);
session.save(ph1);
session.save(ph2);
结果:
Hibernate:
insert
into
Person
(name, id)
values
(?, ?)
Hibernate:
insert
into
Phone
(number, p_id, id)
values
(?, ?, ?)
Hibernate:
insert
into
Phone
(number, p_id, id)
values
(?, ?, ?)
运行同上,结果完美 实例7.只在多端配置映射并且设置级联,先保存多端,再保存一端
session.save(ph1);
session.save(ph2);
session.save(p);
结果:
Hibernate:
insert
into
Person
(name, id)
values
(?, ?)
Hibernate:
insert
into
Phone
(number, p_id, id)
values
(?, ?, ?)
Hibernate:
insert
into
Phone
(number, p_id, id)
values
(?, ?, ?)
运行同上,结果完美

  

Hibernate多对一ManytoOne的更多相关文章

  1. 【Jpa hibernate】一对多@OneToMany,多对一@ManyToOne的使用

    项目中使用实体之间存在一对多@OneToMany,多对一@ManyToOne的映射关系,怎么设置呢? GitHub地址:https://github.com/AngelSXD/myagenorderd ...

  2. Hibernate关联映射(多对一 --- many-to-one)

    转自:https://blog.csdn.net/fengxuezhiye/article/details/7369786?utm_source=blogxgwz9 Hibernate的关联映射关系有 ...

  3. hibernate多对一双向关联

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  4. atitit.atitit.hb many2one relate hibernate 多对一关联配置..

    atitit.atitit.hb many2one relate hibernate 多对一关联配置.. 1. 多对一单向 @ManyToOne 1 1. 其中@JoinColumn 注解 2 2.  ...

  5. hibernate 多对多

    HibernateHibernate多对多关联映射通常别拆分成两个多对一关联映射1. 下面的HostBean.UserBean.UserHostBean,UserHostBean是两个表之间的关联表, ...

  6. hibernate多对一单向关联注解方式

    多对一单向关联,在多的一方加上一的一方作为外键.在程序里表现为:在多的一方加上一的引用. 小组类Group,用户User: Group: package com.oracle.hibernate; i ...

  7. Hibernate多对多两种情况

    Hibernate在做多对多映射的时候,除了原先的两张表外,会多出一个中间表做关联,根据中间表的会有两种不同的配置情况: 1.中间表不需要加入额外数据. 2.中间表有其他字段,需记录额外数据. 下面, ...

  8. Java进阶知识08 Hibernate多对一单向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.在多的一方加外键 1.2.创建Customer类和Order类 package com.shore.model; import javax.persisten ...

  9. hibernate多对多关联映射

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

随机推荐

  1. 使用python来访问Hadoop HDFS存储实现文件的操作

    原文:http://rfyiamcool.blog.51cto.com/1030776/1258292 在调试环境下,咱们用hadoop提供的shell接口测试增加删除查看,但是不利于复杂的逻辑编程 ...

  2. WIFI 万能钥匙万玉权:团队之中要有跨三界之外的“闲人” [转]

      在团队规模较小时,很多事情都可以变得特别简单.比如架构的选择,大部分情况下,最初的架构越简单越好,随着业务的演进,架构才不断完善. 连尚网络经历了从几人到上百人的管理过程,其自主创新研发的产品 W ...

  3. 常用模块Part(1)

    collections模块 time模块 random模块 os模块 sys模块 collections模块 这个模块实现了一些很好的数据结构,它们能帮助你解决各种实际问题 在这里主要介绍几种数据结构 ...

  4. vs开发/IIS 遇到的问题--------笔记

    1.VS2017专业版和企业版激活密钥 Enterprise: NJVYC-BMHX2-G77MM-4XJMR-6Q8QF Professional: KBJFW-NXHK6-W4WJM-CRMQB- ...

  5. phython安装

    点击   https://www.python.org/downloads/ 下载合适的Python版本 下载获取到:python-x.x.x.msi安装包,我们双击python-x.x.x.msi即 ...

  6. cocos-lua3.17 cocos studio lua动画使用

    这里只贴具体使用代码,资源请使用自己的. 这里的资源是cocos studio导出的lua文件,其中就有root和动画 function GameLayer:playLhAni() local ani ...

  7. 18-10-09 Linux常用命令大全(非常全!!!)

     Linux常用命令大全(非常全!!!)   Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制, ...

  8. nodejs -- fs模块 ---> readFile 函数 1) fs.readFile(filename, "binary", function(error, file) 2) response.write(file, "binary");

    一:代码: 1.1 入口文件: index.js var server = require('./server'); var router = require("./router" ...

  9. js文本转语音

    百度找了好多,大概分为两种,一种使用百度语音的API,另一种使用H5自带(低版本不兼容) 下面为一个模拟页面 <!DOCTYPE html><html lang="en&q ...

  10. python while循环案例

    1.while循环语句基本结构? while condition: loop body 2.利用while语句写出猜大小的游戏: 设定一个理想数字比如:66,让用户输入数字,如果比66大,则显示猜测的 ...