@OneToOne
, 表示一对一的映射关系,好比一个帐号对应一个用户,一个实体用来描述帐号的信息(帐号,密码,帐号是否可用,帐号对应的角色等),另一个实体用来描述用户的信息(昵称,年龄,性别,国籍等)。java
该注解有六个属性:git
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
表示关联关系中的级联操做权限,有五种权限:github
CascadeType.PERSIST
:级联新增(又称级联保存);CascadeType.MERGE
:级联合并,更新该实体时,与其有映射关系的实体也跟随更新;CascadeType.REMOVE
:级联删除,删除该实体时,与其有映射关系的实体也跟随删除;CascadeType.REFRESH
:级联刷新,该实体被操做前都会刷新,保证数据合法性;CascadeType.ALL
:包含以上四种级联操做;fetch
数据加载策略,默认值为FetchType.EAGER
:app
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方法等
建立一个用户信息实体fetch
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
来声明在表中不创建对应的映射字段。ui
这里贴出源码,一个关系映射的小例子hibernate
原创不易,感谢支持。code