@OneToOne实例详解
主要是这一截:
@Id// id自动生成@GeneratedValue@Column(name = "id")private Long id;@Column(name = "name")private String name;//cascade:表的级联操作@OneToOne(fetch=FetchType.LAZY,cascade = CascadeType.ALL) //JPA注释: 一对一 关系//referencedColumnName:参考列名,默认的情况下是列表的主键//nullable=是否可以为空,//insertable:是否可以插入,//updatable:是否可以更新// columnDefinition=列定义,//foreignKey=外键@JoinColumn(name="pet_id",referencedColumnName="id",nullable=false)private Pet pet;
表的关联查询比较复杂,应用的场景很多,本文根据自己的经验解释@OneToOne注解中的属性在项目中的应用。本打算一篇博客把增删改查写在一起,但是在改的时候遇到了一些问题,感觉挺有意思,所以写下第二篇专门讲修改。
一、单向@OneToOne实例详解
假设一个场景,一个人只能领养一只宠物,根据人能够找到宠物,并且查看宠物的信息,关系是单向的。
创建人与宠物的数据表结构。下载地址:Person,Pet数据库建表。
创建实体。
Person.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
|
Pet.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
注解@OneToOne的接口定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
注解@OneToOne的属性:
cascade:关联属性,这个属性定义了当前类对象操作了之后,级联对象的操作。本例中定义了:CascadeType.ALL,当前类增删改查改变之后,关联类跟着增删改查。
fetch属性:FetchType类型的属性。可选择项包括:FetchType.EAGER 和FetchType.LAZY。 FetchType.EAGER表示关系类(本例是OrderItem类)在主类加载的时候同时加载,FetchType.LAZY表示关系类在被访问时才加载。默认值是FetchType.LAZY。
mappedBy:拥有关联关系的域,如果关系是单向的就不需要,双向关系表,那么拥有关系的这一方有建立、解除和更新与另一方关系的能力,而另一方没有,只能被动管理,这个属性被定义在关系的被拥有方。双向@OneToOne,双向@OneToMany,双向@ManyToMany。
注解@JoinColumn的接口定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
注解@JoinColumn的属性:
name属性:外键列的名称,默认情况下是:引用实体的字段名称 +“_”+ 被引用的主键列的名称。一般也可以自定义,一般见名知意,就可以采用默认值。
referencedColumnName属性:参考列,默认值是关联表的主键。例如你可以定义pet_name为参考列,那么就会将pet的name的值关联到这一列。
创建类:TableRelationController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
|
创建TableRelationService类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
|
注意:这里关联表更改的时候要注意,如果没有配置好会出现异常。
1 |
|
这是在spring的事务实现中需要判断当前线程中的事务是否同步,而没有事务的时候,那个判断是否同步的方法会因为get返回初始的null值而返回false,最终导致throw一个Could not obtain transaction-synchronized Session for current thread的异常,解决方法有两个:
1)加事物控制。
1 |
|
2)重新生成session。
1 |
|
配置文件中:
1 |
|
测试:postMan发送请求:
增加:
1 2 3 4 5 6 7 8 9 |
|
查询:
1 2 3 |
|
1 2 3 4 5 6 7 8 9 |
|
删除:
1 2 3 |
|
更改:
这里更改了petName,petClass
1 2 3 4 5 6 7 8 |
|
问题:
在更新的时候存在这样的问题,如果刚开是插入数据的时候,没有插入从表Pet的数据。
1 2 3 4 5 |
|
此时如果想在更新数据,给King添加一个pet数据,那么就会一直插入。
1 2 3 4 5 6 7 8 |
|
这是因为程序在执行save操作的时候,默默的执行了下面的语句。
1 2 3 4 5 |
|
第一条语句查出来是空,所以会执行插入操作。其实这边也没有完全搞懂,欢迎留言!
这个问题的解决方式,请参考双向一对一映射@OneToOne。
原文链接:https://www.cnblogs.com/boywwj/p/8092915.html
@OneToOne实例详解相关推荐
- 一对一关联查询注解@OneToOne的实例详解
表的关联查询比较复杂,应用的场景很多,本文根据自己的经验解释@OneToOne注解中的属性在项目中的应用.本打算一篇博客把增删改查写在一起,但是在改的时候遇到了一些问题,感觉挺有意思,所以写下第二篇专 ...
- 一对一关联查询注解@OneToOne的实例详解(一)
转载自: https://www.cnblogs.com/boywwj/p/8092915.html 一对一关联查询注解@OneToOne的实例详解 表的关联查询比较复杂,应用的场景很多,本文根据自己 ...
- java异常例子_java 异常的实例详解
java 异常的实例详解 1.异常的定义:程序在运行时出现不正常情况. 异常的划分: Error:严重的问题,对于error一般不编写针对性的代码对其进行处理. Exception:非严重的问题,对于 ...
- python 自动化办公 案例_python自动化工具之pywinauto实例详解
python自动化工具之pywinauto实例详解 来源:中文源码网 浏览: 次 日期:2019年11月5日 [下载文档: python自动化工具之pywinauto实例详解.txt ] (友情提示: ...
- java写exe程序实例,java实现可安装的exe程序实例详解
java实现可安装的exe程序实例详解 通过编写java代码,实现可安装的exe文件的一般思路: 1.在eclipse中创建java项目,然后编写java代码,将编写好的java项目导出一个.jar格 ...
- python多进程应用场景_python使用多进程的实例详解
python多线程适合IO密集型场景,而在CPU密集型场景,并不能充分利用多核CPU,而协程本质基于线程,同样不能充分发挥多核的优势. 针对计算密集型场景需要使用多进程,python的multipro ...
- php可以打印一个页面,利用html实现分页打印功能的实例详解
本篇介绍利用html实现分页打印功能的实例详解,有些不想打印出来的分页打印的都可以应用这类样式进行控制 在非打印时是无效的. 页面打印 /* 应用这个样式的在打印时隐藏 */ .noPrint { d ...
- python判断是否回文_对python判断是否回文数的实例详解
设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.例如,若n=1234321,则称n为一回文数:但若n=1234567,则n不是回文数. 上面的解释就是说回文数和逆 ...
- python2.7除法_对python中的float除法和整除法的实例详解
从python2.2开始,便有两种除法运算符:"/"."//".两者最大区别在: python2.2前的版本和python2.2以后3.0以前的版本的默认情况下 ...
最新文章
- 【实验楼】python简明教程
- 【ES6】Generator函数详解
- [转]JavaScript代码收集
- AngularJS基于MVC的复杂操作案例
- 初识函数式编程(Functional Programming,FP)
- C#LeetCode刷题之#461-汉明距离​​​​​​​(Hamming Distance)
- 美国一鹦鹉趁主人不在家上网购物:买的都是水果蔬菜
- .net byte转java byte_CVE20200688的武器化与.net反序列化漏洞那些事
- 如何用四个简单的步骤加速 LibreOffice
- [渝粤教育] 中国地质大学 审计学 复习题 (2)
- 惠普台式电脑引导不了系统_惠普电脑装完系统怎么硬盘启动不了怎么办
- 单片机课设中期报告_本科毕业设计中期检查报告.doc
- 计算机msvcp110.dll丢失,msvcp110.dll丢失怎样修复
- 程序员慵懒的周末:不想出门还想吃肯德基香辣鸡翅?
- Photoshop抠图(用调整边缘命令抠图)
- Windows NT引导过程源代码分析(一)
- 第二部分 项目管理标准
- U8 ActiveX 部件不能创建对象
- Kotlin第三章:AndroidUI简介
- Java实现就诊排队叫号系统(使用ArrayList集合实现)