Hibernate 一对一映射关系(唯一外键映射)
-
用户基本信息与扩展信息的映射关系
我们先来看看这一对一映射可以用在什么场景。
需求:录入用户基本信息,并且可以扩展用户扩展信息
那么我们可以知道 用户基本信息 和 用户扩展信息 是形成一 一对应关系的
关系图如下:
表创建SQL:
<pre>
CREATE TABLE BaseInfo
(
baseinfo_id
VARCHAR(32) NOT NULL ,
baseinfo_mobile
VARCHAR(11) NOT NULL UNIQUE,
extendinfo_id
VARCHAR(32) NOT NULL,
PRIMARY KEY (baseinfo_id
)
);
CREATE TABLE ExtendInfo
(
extendinfo_id
VARCHAR(32) NOT NULL ,
extendinfo_email
VARCHAR(32),
extendinfo_weibo
VARCHAR(32),
extendinfo_qq
VARCHAR(32),
extendinfo_wechat
VARCHAR(32),
PRIMARY KEY (extendinfo_id
)
);
ALTER TABLE BaseInfo
ADD CONSTRAINT BaseInfo_fk0
FOREIGN KEY (extendinfo_id
) REFERENCES ExtendInfo
(extendinfo_id
);
</pre>
扩展信息表中的主键ID作为基本信息表的外键
两个实体类的Java代码:
基本信息 BaseInfo
<pre>
package com.elyar.spring.entity;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.*;
/**
- Created by ElyarAnwar on 2017/3/7.
*/
@Entity
@Table(name = "BaseInfo")
public class BaseInfo {
@Id
@GenericGenerator(name = "uuid", strategy = "uuid")
@GeneratedValue(generator = "uuid")
private String baseinfo_id;
</br>
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn("extendinfo_id")
private ExtendInfo extendinfo_id;
</br>
public BaseInfo() {
}
</br>
public BaseInfo(ExtendInfo extendinfo_id) {
this.extendinfo_id = extendinfo_id;
}
</br>
public String getBaseinfo_id() {
return baseinfo_id;
}
</br>
public void setBaseinfo_id(String baseinfo_id) {
this.baseinfo_id = baseinfo_id;
}
</br>
public ExtendInfo getExtendinfo_id() {
return extendinfo_id;
}
</br>
public void setExtendinfo_id(ExtendInfo extendinfo_id) {
this.extendinfo_id = extendinfo_id;
}
}
</pre>
扩展信息 ExtendInfo
<pre>
package com.elyar.spring.entity;
import org.hibernate.annotations.GenericGenerator;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
/**
-
Created by ElyarAnwar on 2017/3/7.
*/
@Entity
@Table(name = "ExtendInfo")
public class ExtendInfo {@Id
@GenericGenerator(name = "uuid", strategy = "uuid")
@GeneratedValue(generator = "uuid")
private String extendinfo_id;</br>
// 用户扩展信息-邮箱
private String extendinfo_email;
</br>
// 用户扩展信息-微博
private String extendinfo_weibo;
</br>
// 用户扩展信息-QQ
private String extendinfo_qq;
</br>
// 用户扩展信息-微信
private String extendinfo_wechat;
</br>
public ExtendInfo() {
}
</br>
public ExtendInfo(String extendinfo_email, String extendinfo_weibo, String extendinfo_qq, String extendinfo_wechat) {
this.extendinfo_email = extendinfo_email;
this.extendinfo_weibo = extendinfo_weibo;
this.extendinfo_qq = extendinfo_qq;
this.extendinfo_wechat = extendinfo_wechat;
}
</br>
public String getExtendinfo_id() {
return extendinfo_id;
}
</br>
public void setExtendinfo_id(String extendinfo_id) {
this.extendinfo_id = extendinfo_id;
}
</br>
public String getExtendinfo_email() {
return extendinfo_email;
}
</br>
public void setExtendinfo_email(String extendinfo_email) {
this.extendinfo_email = extendinfo_email;
}
</br>
public String getExtendinfo_weibo() {
return extendinfo_weibo;
}
</br>
public void setExtendinfo_weibo(String extendinfo_weibo) {
this.extendinfo_weibo = extendinfo_weibo;
}
</br>
public String getExtendinfo_qq() {
return extendinfo_qq;
}
</br>
public void setExtendinfo_qq(String extendinfo_qq) {
this.extendinfo_qq = extendinfo_qq;
}
</br>
public String getExtendinfo_wechat() {
return extendinfo_wechat;
}
</br>
public void setExtendinfo_wechat(String extendinfo_wechat) {
this.extendinfo_wechat = extendinfo_wechat;
}
}
</pre>
测试:
<pre>
package com.elyar.spring.test;
import com.elyar.spring.entity.BaseInfo;
import com.elyar.spring.entity.ExtendInfo;
import com.elyar.spring.entity.UserBaseInfo;
import com.elyar.spring.entity.UserExtedInfo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/***
*** Created by ElyarAnwar on 2017/2/28.
****/
public class Test {
</br>
private ApplicationContext applicationContext;
</br>
@org.junit.Test
public void test() {
</br>
applicationContext = new ClassPathXmlApplicationContext("config/applicationContext.xml");
SessionFactory sessionFactory = applicationContext.getBean(SessionFactory.class);
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
</br>
BaseInfo baseInfo = new BaseInfo();
</br>
ExtendInfo extendInfo = new ExtendInfo();
extendInfo.setExtendinfo_email("1389****061@163.com");
extendInfo.setExtendinfo_qq("734****82");
extendInfo.setExtendinfo_weibo("扔物线的轨迹");
extendInfo.setExtendinfo_wechat("1389****061");
</br>
baseInfo.setExtendinfo_id(extendInfo);
</br>
session.save(baseInfo);
transaction.commit();
}
}
</pre>
因为我们在BeasInfo中设置了@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
级联所有操作,所以只需保存BaseInfo即可,不然需要保存BaseInfo和ExtendInfo。
现在来看看数据库的变化吧:
可以看到ExtendInfo表中的主键ID和BaseInfo表中的extendinfo_id是一 一 对应的。
至此完成了用户基本信息和扩展信息的映射。
如有问题请私信。转载请注明出处:http://www.jianshu.com/u/1c0e16576578 ElyarAnwar 分享是最好的记忆