Hibernate多对一ManytoOne
------------------------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的更多相关文章
- 【Jpa hibernate】一对多@OneToMany,多对一@ManyToOne的使用
项目中使用实体之间存在一对多@OneToMany,多对一@ManyToOne的映射关系,怎么设置呢? GitHub地址:https://github.com/AngelSXD/myagenorderd ...
- Hibernate关联映射(多对一 --- many-to-one)
转自:https://blog.csdn.net/fengxuezhiye/article/details/7369786?utm_source=blogxgwz9 Hibernate的关联映射关系有 ...
- hibernate多对一双向关联
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- atitit.atitit.hb many2one relate hibernate 多对一关联配置..
atitit.atitit.hb many2one relate hibernate 多对一关联配置.. 1. 多对一单向 @ManyToOne 1 1. 其中@JoinColumn 注解 2 2. ...
- hibernate 多对多
HibernateHibernate多对多关联映射通常别拆分成两个多对一关联映射1. 下面的HostBean.UserBean.UserHostBean,UserHostBean是两个表之间的关联表, ...
- hibernate多对一单向关联注解方式
多对一单向关联,在多的一方加上一的一方作为外键.在程序里表现为:在多的一方加上一的引用. 小组类Group,用户User: Group: package com.oracle.hibernate; i ...
- Hibernate多对多两种情况
Hibernate在做多对多映射的时候,除了原先的两张表外,会多出一个中间表做关联,根据中间表的会有两种不同的配置情况: 1.中间表不需要加入额外数据. 2.中间表有其他字段,需记录额外数据. 下面, ...
- Java进阶知识08 Hibernate多对一单向关联(Annotation+XML实现)
1.Annotation 注解版 1.1.在多的一方加外键 1.2.创建Customer类和Order类 package com.shore.model; import javax.persisten ...
- hibernate多对多关联映射
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
随机推荐
- CCF关于NOIP竞赛程序提交的管理规则
在NOIP复赛中,NOI各省组织单位必须严格遵循CCF<关于NOIP数据提交格式的说明>的规范在竞赛结束后规定时间内向CCF提交本赛区所有参赛选手的程序. 为竞赛的公平以及赛后按时完成竞赛 ...
- JavaScript 设计模式的七大原则(未完成)
设计模式(面向对象)有七大设计原则,分别是: 开闭原则:对扩展开放,对修改关闭 单一职责原则:每一个类应该专注于做一件事情 里氏替换原则:父类存在的地方,子类是可以替换的 依赖倒转原则:实现尽量依赖抽 ...
- php源代码安装
1.在官网下载php安装源文件.版本选择5的最新稳定版. [root@trial download]# wget http://cn.php.net/distributions/php-5.5.38. ...
- python面向对象封装案例(附:is和==的区别)
面向对象封装案例 目标 封装 小明爱跑步 存放家具 01. 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对 ...
- 20165326 java实验五
实验五 网络编程与安全 一.实验内容 任务一: 结对实现中缀表达式转后缀表达式的功能 MyBC.java 结对实现从上面功能中获取的表达式中实现后缀表达式求值的功能,调用MyDC.java 这个代码在 ...
- linux系统转换root权限
有时候我们用普通用户的权限没办法完成有关权限,这时候我们就需要拿到root权限才可以,拿到root权限有两种方式 方式一: su - 或者su 此时就会提示你输入密码,输入密码成功以后就能以root权 ...
- js--函数声明和函数表达式--执行顺序
思考: notice:在写JS代码的时候,有两种写法,一种是函数表达式,另外一种是函数声明方式.我们需要重点注意的是,只有函数声明形式才能被提升. function hoistFunction() { ...
- junit断言和junit注释assert
JUnit - 使用断言 断言 所有的断言都包含在 Assert 类中 public class Assert extends java.lang.Object 这个类提供了很多有用的断言方法来编写测 ...
- Android开发中Activity状态的保存与恢复
当置于后台的Activity因内存紧张被系统自动回收的时候,再次启动它的话他会重新调用onCretae()从而丢失了之前置于后台前的状态. 这时候就要重写Activity的两个方法来保存和恢复状态,具 ...
- Windows跨域远程连接防火墙设置
按照正常的防火墙的设置,发现跨域远程依然不行,后来进过排除法发现 还需要打开icmpv4所有的协议,才可以