------------------------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. prefixspan python

    from:https://github.com/chuanconggao/PrefixSpan-py API Usage Alternatively, you can use the algorith ...

  2. JS-使用indexof来统计字符出现次数

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. CHECK约束表达式

    1.性别:只能填写'男'和'女' (字段名='男'or 字段名='女') 注意:单引号里的值可以为其他任何字 2.规定密码长度不能小于6位数 (len([字段名])>(5))   3.例:成绩在 ...

  4. 简述servlet

    什么是Servlet? Servlet是一种动态的web开发技术,本质就是一个运行在服务端的Java小程序,负责处理业务逻辑,生成动态web内容. 编写一个servlet步骤: 1.编写一个类  继承 ...

  5. vue,在模块中动态添加dom节点,并监听

    在这里,onclick事件没有作用,因为它指向的是window,如果写为this.click页面显示为undefined, 我采用的是通过class绑定事件,但是会有一个问题,那就是当你渲染多个事件时 ...

  6. .NET并行计算和并发7-Task异步

    使用任务并行库执行异步任务 下面的示例演示如何通过调用 TaskFactory.StartNew 方法来创建并使用 Task 对象. using System; using System.Thread ...

  7. CPU查询

    请问:两路四核超线程=多少CPU??? 答案:16个 一.解释说明 两路=物理主机中,CPU的卡槽,槽位,这个无法增加,一个萝卜一个坑.就更内存卡槽一样,两个内存卡卡槽,a+b=总内存. 路=槽位=插 ...

  8. Linux搭建SVN环境

    1.安装SVN yun install -y subversion root权限安装 安装成功 验证 svnserve --version 创建SVN版本库 cd /home/kuma/下载 mkdi ...

  9. Parsing with Compositional Vector Grammars--paper

    这篇和2012年的区别: 1)Max-Margin Training Objective J中RNN变为了CVG 2012-两个词向量合并并打分,这个-两个(词向量,POS)合并并打分 2012年: ...

  10. 20155208徐子涵 Exp5 MSF基础应用

    20155208徐子涵 Exp5 MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode. Exploit:Exploit 的英文意思就是利用,它在黑客眼里就是 ...