Spring Data JPA关系映射@OneToOne实例解析

 更新时间:2023年08月17日 10:21:03   作者:虚惊一百场  
这篇文章主要为大家介绍了Spring Data JPA关系映射@OneToOne实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

@OneToOne

表示一对一的映射关系,比如一个账号对应一个用户,一个实体用来描述账号的信息(账号,密码,账号是否可用,账号对应的角色等),另外一个实体用来描述用户的信息(昵称,性别,国籍等)。

属性

该注解有六个属性:

public @interface OneToOne {
    java.lang.Class targetEntity() default void.class;
    javax.persistence.CascadeType[] cascade() default {};
    javax.persistence.FetchType fetch() default javax.persistence.FetchType.EAGER;
    boolean optional() default true;
    java.lang.String mappedBy() default "";
    boolean orphanRemoval() default false;
}
  • targetEntity 关联目标实体类,指定类型后该属性可省略;
  • cascade表示关联关系中的级联操作权限,有五种权限:

    • CascadeType.PERSIST:级联新增(又称级联保存);
    • CascadeType.MERGE:级联合并,更新该实体时,与其有映射关系的实体也跟随更新;
    • CascadeType.REMOVE:级联删除,删除该实体时,与其有映射关系的实体也跟随删除;
    • CascadeType.REFRESH:级联刷新,该实体被操作前都会刷新,保证数据合法性;
    • CascadeType.ALL:包含以上四种级联操作;
  • fetch数据加载策略,默认值为FetchType.EAGER

    • FetchType.LAZY 表示数据获取方式为懒加载;
    • FetchType.EAGER 表示数据获取方式为急加载;
  • optional 表示关联关系是否必须,当该值为true时,one的一方可以为null
  • mappedBy 指定映射关系由哪一方维护,一般使用在双向映射场景;
  • orphanRemoval 孤值删除,将会删除孤立数据,外键为null的数据将被删除;

关联关系

我们在使用的时候,通常为了保证表的简洁性,将主键共享,意思是用户的id和账号的id是一样的,不在表中单独存在一个字段用来描述关联关系;比如下面的例子:

创建账号实体

import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;
import javax.persistence.*;
@Table(name = "base_account")
@Entity
@org.hibernate.annotations.Table(appliesTo = "base_account", comment = "账号信息表")
public class AccountDO {
    @Id
    @GenericGenerator(name="idGenerator", strategy = "uuid")
    @GeneratedValue(generator = "idGenerator")
    @Column(name = "ACCOUNT_ID", length = 32)
    private String accountId;
    @Column(name = "USERNAME", columnDefinition = "VARCHAR(32) NOT NULL COMMENT '账号'")
    private String username;
    @Column(name = "PASSWORD", columnDefinition = "VARCHAR(128) NOT NULL COMMENT '密码'")
    private String password;
    @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.REFRESH})
    @PrimaryKeyJoinColumn
    private UserDO userDO;
    // 省略构造函数,get/set方法,toString方法等

创建一个用户信息实体

import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;
import javax.persistence.*;
@Table(name = "base_user")
@Entity
@org.hibernate.annotations.Table(appliesTo = "base_user", comment = "用户信息表")
public class UserDO {
    @Id
    @GenericGenerator(name = "idGenerator", strategy = "foreign", parameters = @Parameter(name = "property", value = "accountDO"))
    @GeneratedValue(generator = "idGenerator")
    @Column(name = "USER_ID", length = 32)
    private String userId;
    @Column(name = "NICKNAME", columnDefinition = "VARCHAR(32) NOT NULL COMMENT '昵称'")
    private String nickname;
    @Column(name = "SEX", columnDefinition = "CHAR(2) DEFAULT NULL COMMENT '性别'")
    private String sex;
    @OneToOne(mappedBy = "userDO")
    private AccountDO accountDO;
        // 省略构造函数,get/set方法,toString方法等

用户实体的主键和账号实体的主键都使用一个生成策略,生成的id也一样,且在账号实体中使用@PrimaryKeyJoinColumn来声明在表中不建立对应的映射字段。

这里贴出源码,一个关系映射的小例子

以上就是Spring Data JPA关系映射@OneToOne实例解析的详细内容,更多关于Spring Data JPA @OneToOne的资料请关注脚本之家其它相关文章!

相关文章

  • Java Math.round(),Math.ceil(),Math.floor()的区别详解

    Java Math.round(),Math.ceil(),Math.floor()的区别详解

    这篇文章主要介绍了Java Math.round(),Math.ceil(),Math.floor()的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • 清理本地Maven仓库的方法示例

    清理本地Maven仓库的方法示例

    这篇文章主要介绍了清理本地Maven仓库的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • GraalVM系列Native Image Basics静态分析

    GraalVM系列Native Image Basics静态分析

    这篇文章主要为大家介绍了GraalVM系列Native Image Basics静态分析详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Java String类的性质与比较

    Java String类的性质与比较

    字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串,本文将为你带来详细介绍,感兴趣的朋友继续往下看吧
    2021-10-10
  • Jackson忽略字段实现对字段进行序列化和反序列化

    Jackson忽略字段实现对字段进行序列化和反序列化

    在使用 Jackson 进行序列化和反序列化时,有时候需要对某些字段进行过滤,以便在 JSON 数据中不包含某些敏感信息,下面就一起来了解一下Jackson忽略字段实现对字段进行序列化和反序
    2023-10-10
  • 详解Java中Callable和Future的区别

    详解Java中Callable和Future的区别

    这篇文章主要介绍了Java中Callable和Future的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-11-11
  • java DateUtil工具类时间戳类型转换详解

    java DateUtil工具类时间戳类型转换详解

    这篇文章主要为大家详细介绍了java DateUtil工具类时间戳类型转换的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 基于JavaMail实现邮件发送

    基于JavaMail实现邮件发送

    这篇文章主要为大家详细介绍了基于JavaMail实现邮件发送功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Java与Node.js利用AES加密解密出相同结果的方法示例

    Java与Node.js利用AES加密解密出相同结果的方法示例

    这篇文章主要介绍了Java与Node.js利用AES加密解密出相同结果的方法,文中给出了详细的示例代码,相信对大家的学习或者工作能带来一定的帮助,需要的朋友们下面来一起看看吧。
    2017-02-02
  • springboot如何通过SSH连接远程服务器

    springboot如何通过SSH连接远程服务器

    这篇文章主要介绍了springboot如何通过SSH连接远程服务器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论