------------------------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. jquery.form.js 实现异步上传

    前台: <form id="formSeacrh" action="/ResumeInfo/uploadFile" method="post&q ...

  2. 高性能消息中间件——NATS

    前 言 这段时间我的主要工作内容是将公司系统中使用的RabbitMQ替换成NATS,而此之前我对Nats一无所知.经过一段时间紧张的学习和开发之后我顺利的完成了任务,并对消息中间件有了更深的了解.在此 ...

  3. Django--filter(**kwargs)

    Django--filter(**kwargs)-exclude(**kwargs) filter() 说明: 数据的过滤 返回Queryset包含与给定查找参数匹配的新对象.这里需要特别注意的地方就 ...

  4. nginx 支持的命令行参数

    Command-line parameters 命令行参数 nginx supports the following command-line parameters: nginx支持以下命令行参数 - ...

  5. Unable to load DLL 'api-ms-win-core-localization-l1-2-0.dll': 找不到指定的模块

    asp.net mvc 4.6 发布到WinServer2008R2 SP1 提示 错误 Unable to load DLL 'api-ms-win-core-localization-l1-2-0 ...

  6. wpf-x-指令元素

    1. x:Code 用于代码前置  可以吧 C#代码内嵌到前端里 2. x:XData 用于内嵌xml 文件

  7. 学习Hibenate随笔

    1.Hibenate是一个开放源代码的对象关系映射框架,它对JDBC进行了轻量级的对象封装,将pojo类与数据库表建立映射关系,是一个全自动orm框架,Hibenate可以自动生成sql语句,自动执行 ...

  8. SpringBoot(三)thymeleaf+JPA+MySql

    接着上一节的 第一步:在pom文件中加入以下代码: <!--JPA--> <dependency> <groupId>org.springframework.boo ...

  9. excel图片链接转图片

    Sub LoadImage() Dim HLK As Hyperlink, Rng As Range For Each HLK In ActiveSheet.Hyperlinks '循环活动工作表中的 ...

  10. Centos 安装 python2.7.10以及pip

    安装python2.7.10 1. 下载安装包并解压 wget https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz tar -xf P ...