JavaWeb

Hibernate One-To-One Mapping

2017-03-07  本文已影响57人  ElyarAnwar
  • Hibernate 一对一映射关系(唯一外键映射)

我们先来看看这一对一映射可以用在什么场景。

需求:录入用户基本信息,并且可以扩展用户扩展信息

那么我们可以知道 用户基本信息用户扩展信息 是形成一 一对应关系的

关系图如下:


one-to-one mapping

表创建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.*;

/**

@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;

/**

测试:

<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。

现在来看看数据库的变化吧:

BaseInfo Table ExtendInfo Table

可以看到ExtendInfo表中的主键ID和BaseInfo表中的extendinfo_id是一 一 对应的。

至此完成了用户基本信息和扩展信息的映射。

如有问题请私信。转载请注明出处:http://www.jianshu.com/u/1c0e16576578 ElyarAnwar 分享是最好的记忆

上一篇 下一篇

猜你喜欢

热点阅读