JPA#OneToOne
无力吐槽。
一对一,一个人有一个身份证号码、一个人有一条命,类似于这一种的就是一对一的关系。
涉及到的注解两个:
OneToOne
JoinColumn(
name="当前实体对应数据库表中的字段名称,这个字段是一对一关系中对方的主键,这个字段是本表中的外键",
referencedColumnName="这是个数据库表的字段名称,字段为当前表的外键所对应的另外一张表的主键"
)
JsonIgnoreProperties(value = {"需要被忽略的字段名称,这个字段来自哪里需要通过实际情况判定"})
举一个例子:一个学生有一个桌子
@Entity
@Table(name="t_student")
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private Integer id; @Column(name="name")
private String name; /**
* Column作用在实体的简单属性上面,简单属性就是String,Integer等类型,
* 体现在数控表上面就是一个字段。
*
* JoinColumn 作用在实体的复杂属性上面,复杂属性就是别的实体,
* 体现在数据库表格上面就是一个外键。
*
* JoinColumn.name 是当前复杂属性(此处是desk)在本实体所对应数据库表(t_student)的外键(即t_student.desk_id)。
* JoinColumn.referencedColumnName 外键(desk_id)所引用的那个表(t_desk)的主键(id)。
*
* JsonIgnoreProperties.value 是在序列化本实体Student对象为JSON时,在处理复杂属性desk时候,忽略desk的student属性
* 否则将会导致desk与student实例间的相互引用产生死循环。
*/
@OneToOne
@JoinColumn(name="desk_id",referencedColumnName="id")
@JsonIgnoreProperties(value="student")
private Desk desk; @Override
public String toString() {
return ReflectionToStringBuilder.toString(this, ToStringStyle.MULTI_LINE_STYLE);
} }
@Entity
@Table(name="t_desk")
public class Desk {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="id")
private Integer id; @Column(name="name")
private String name; /**
* mappedBy的取值往往是两个关联关系对应实体(此处是Student与Desk)中另外一个实体(Student)的一个属性(desk)。
*
* 如何理解呢?下面是个人的理解,可能不准确。
* Desk这个类拥有id,name,student三个属性,
* desk.student属性如何与student类的实例进行关联呢?
* 当然是通过student的desk属性,让desk.student与student进行关联。
* 因此,此处的mappedBy应该为被注解的属性的一个属性,被注解的属性的属性应该是本实体对应数据库表的在其他表中的一个外键。
*/
@JsonIgnoreProperties(value="desk")
@OneToOne(mappedBy="desk")
private Student student; @Override
public String toString() {
return ReflectionToStringBuilder.toString(this, ToStringStyle.MULTI_LINE_STYLE);
} }
数据库表:
_
映射,无论是一对一或者是其他的映射形式,都在另外一个维度分为单向的映射,以及双向映射。其中双向映射时候,JSON序列化会产生死循环。
解决双向映射时候的json序列化死循环需要通过类似@JsonIgnoreProperties(value = {"student"})的注解来完成。
@JsonIgnoreProperties的作用是被作用的实体属性的属性如果需要被忽略(往往是死循环的原因),就用这个注解来完成。
JPA#OneToOne的更多相关文章
- JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析
JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...
- Spring JPA中OneToOne和OneToMany用法
Spring工程中,创建实体对象时,可以通过JPA的@Entity标识实体与数据库表的对应关系,@Column标识数据库字段.其中还有标识两个实体间关系的注解:@OneToOne.@OneToMany ...
- Spring boot data JPA数据库映射关系 : @OneToOne,@OneToMany,@ManyToMany
问题描述 在利用Spring boot data JPA进行表设计的时候,表对象之间经常存在各种映射关系,如何正确将理解的映射关系转化为代码中的映射关系是关键之处. 解决办法 概念理解 举例:在公司的 ...
- websphere部署 hibernate jpa & Error 500: javax/persistence/OneToOne.orphanRemoval()Z
WebSphere 7 & Javax/Persistence/OneToMany.OrphanRemoval() Error 文章出处:http://www.mkyong.com/websp ...
- JPA关系映射之one-to-one
一对一关联有两种实现方式:一种是共享的主键关联,另一种是一对一的外键关联 1.共享的主键关联:让两个对象具有共同的主键值,以表明他们之间的一一对应关系. Person.java类 public cla ...
- JPA中关联关系(OneToOne、OneToMany、ManyToMany,ManyToOne)映射代码片段
在使用Hibernate的时候我们常常会在类里边配置各种的关联关系,但是这个并不是很好配置,配置不当会出现各种各样的问题,下面具体来看一下: 首先我们来看User类里边有一个IdentityCard类 ...
- JPA笔记3 OneToOne
package one_to_one; import javax.persistence.Entity; import javax.persistence.FetchType; import java ...
- spring boot jpa 多表关联 @OneToOne @OneToMany @ManyToOne@ManyToMany
1.一对一关联 @OneToOne import lombok.Data; import javax.persistence.*; /** * @Author: GWL * @Description: ...
- jpa
学习尚硅谷jpa笔记: 所依赖的jar包: 首先在META-INF下创建配置文件,persistence.xml <?xml version="1.0" encoding=& ...
随机推荐
- Python 基础之面向对象类的继承与多态
一.继承 定义:一个类除了拥有自身的属性方法之外,还拥有另外一个类的属性和方法继承: 1.单继承 2.多继承子类: 一个类继承了另外一个类,那么这个类是子类(衍生类)父类:一个类继承了另外一个类,被继 ...
- Windows下ARP协议的工作原理简介
ARP协议(Address Resolve Protocol,地址解析协议)工作在TCP/IP协议的第二层-数据链路层,用于将IP地址转换为网络接口的硬件地址(媒体访问控制地址,即MAC地址). ...
- PaperReading20200226
CanChen ggchen@mail.ustc.edu.cn To share or not share Motivation: With the publiaction of NAS101, ...
- linux上实现jmeter分布式压力测试(转)
摘要:最近根据公司工作的需求,学习了一些压力测试的知识,目前,公司使用的是jmeter进行压力测试.下面就记录下近期的学习.我想将这次的博文分成三个部分:1.开始测试前的准备(测试环境的搭建)2.在一 ...
- P1002 A+B for Polynomials (25分)
1002 A+B for Polynomials (25分) This time, you are supposed to find A+B where A and B are two polyn ...
- ReentrantReadWriteLock之读写锁判断
一. 读写锁是怎么实现的? 继承AQS,然后通过将AQS中的state转化为二进制,分为高16位和低16位来区分.高16位表示读状态,低16位为写状态. 二. 解析表示方式(高低16位) 假设此时st ...
- MySQL部分语法
MySQL 1.先进入到d盘根目录(自己安装MySQL的盘符) cd d:\2.输入net start mysql3.在d盘的根目录下输入mysql -u root -p就可以进入mysql的命令提示 ...
- Thymeleaf--起步
Spring官方支持的服务的渲染模板中,并不包含jsp.而是Thymeleaf和Freemarker等,而Thymeleaf与SpringMVC的视图技术,及SpringBoot的自动化配置集成非常完 ...
- Python 绘图
python绘图库有很多,底层的就是matplotlib,另外还有基于matplotlib的更方便,代码可读性更强的库,比如seaborn.plotnine等.各个库之间的对比: https://ww ...
- redis提供的持久化机制(rdb,aof)
Redis提供的持久化机制 Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速. 近日,R ...