资讯专栏INFORMATION COLUMN

Spring Data JPA关系映射@OneToOne

zhangke3016 / 639人阅读

摘要:表示一对一的映射关系,比如一个账号对应一个用户,一个实体用来描述账号的信息账号,密码,账号是否可用,账号对应的角色等,另外一个实体用来描述用户的信息昵称,年龄,性别,国籍等。这里贴出源码,一个关系映射的小例子原创不易,感谢支持。

@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 = "AGE", columnDefinition = "TINYINT DEFAULT NULL COMMENT "年龄"")
    private Integer age;

    @Column(name = "SEX", columnDefinition = "CHAR(2) DEFAULT NULL COMMENT "性别"")
    private String sex;

    @OneToOne(mappedBy = "userDO")
    private AccountDO accountDO;
    
        // 省略构造函数,get/set方法,toString方法等

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

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

原创不易,感谢支持。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75732.html

相关文章

  • Spring Boot QuickStart (5) - Spring Data JPA

    摘要:关联关系的关联关系定义上,感觉并不是很灵活,姿势也比较难找。如,定义在关联关系上的参数可以设置级联的相关东西。因为序列化会涉及到实体类关联对象的获取,会触发所有的关联关系。 接(4) - Database 系列. Java Persistence API,可以理解就是 Java 一个持久化标准或规范,Spring Data JPA 是对它的实现。并且提供多个 JPA 厂商适配,如 Hi...

    sutaking 评论0 收藏0
  • String Data JPA 学习笔记

    摘要:说明首先来说是一个持久化规范,也就是说当我们用的时候我们不需要去选面向的编程了,这样就大大降低了偶和度了引入是一种规范,那么它的编程有哪些要求呢引入下载的包导入文件夹,然后我们的在下面加上一个目录在该文件夹下面加上一个文件,这个文件的规范 说明 首先来说JPA是一个持久化规范,也就是说当我们用jpa的时候我们不需要去选面向hibernate的api编程了,这样就大大降低了偶和度了 引入...

    Java_oldboy 评论0 收藏0

发表评论

0条评论

zhangke3016

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<