我们常在设计表时会使用到三种表结构
一对一
一对多
多对多
今天分享这三种关系在Hibernate中的实现方式:
一对一
Husband.java
测试类
运行结果:
一对一
一对多
多对多
今天分享这三种关系在Hibernate中的实现方式:
一对一
这里举个例子 是我们人和身份证的ID
首先需要在
hibernate.cfg.xml中添加映射
<mapping class="cn.itheima.onetoone.User" />
<mapping class="cn.itheima.onetoone.IDCard" />
基于外键映射的注解开发
User.java
package cn.itheima.onetoone;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity // 声明一个实体类
@Table(name = "tbl_user") // 描述类与表对应
public class User {
@Id // 主键
@GenericGenerator(strategy = "uuid", name = "myuuid") // 自定义,使用uuid作为主键
@GeneratedValue(generator = "myuuid")
private String id;
private String name;
/*
* 这是一对一的注解,
* 参数targetEntity是指将要关联的类,这个也可以不指定
* 参数mappedBy是指当前类对应的表放弃主键维护,相当于配置文件中的inverse="true"
* 注意:这里的mappedBy = "user" 的user是类IDCard的属性名private User user;
*/
@OneToOne(targetEntity = IDCard.class, mappedBy = "user")
private IDCard idcard;
/*
* 提供get/set方法
*/
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public IDCard getIdcard() {
return idcard;
}
public void setIdcard(IDCard idcard) {
this.idcard = idcard;
}
}
package cn.itheima.onetoone;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.GenericGenerator;
@Entity //声明一个实体类
@Table(name="tbl_idcard")//描述类与表对应
public class IDCard {
@Id
@GenericGenerator(strategy = "uuid", name = "myuuid") // 自定义,使用uuid作为主键
@GeneratedValue(generator = "myuuid")
private String id;
private String num;
@OneToOne(targetEntity=User.class)//同样指定为OneToOne
/*
* 外键的名字c_user_id
*/
@JoinColumn(name="c_user_id",unique=true)
/*
*级联保存使用
*/
@Cascade(CascadeType.SAVE_UPDATE)
private User user;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getNum() {
return num;
}
public void setNum(String name) {
this.num = name;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
测试类
UserIdCardTest.java
package cn.itheima.onetoone;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.itheima.utils.HibernateUtils;
public class UserIdCardTest {
/*
* 测试外键连接方式
*/
@Test
public void test1(){
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
User user = new User();
user.setName("王小刚");
IDCard card = new IDCard();
card.setNum("500323193809013424533");
card.setUser(user);
session.save(card);
transaction.commit();
session.close();
}
}
数据库结果
tbl_user
tbl_idcard
基于主键映射的注解开发
描述丈夫与妻子的关系
hibernate的核心配置文件
hibernate.cfg.xml
<mapping class="cn.itheima.onetoone.Wife" />
<mapping class="cn.itheima.onetoone.Husband" />
wife.java
package cn.itheima.onetoone;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
@Entity //声明一个实体类
@Table(name="tbl_wife")//描述类与表对应
public class Wife {
//主键标记
@Id
//生成主键策略
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Integer id;
private String name;
//设置一对一对应
@OneToOne
@PrimaryKeyJoinColumn
//级联保存
@Cascade(CascadeType.SAVE_UPDATE)
private Husband husband;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Husband getHusband() {
return husband;
}
public void setHusband(Husband husband) {
this.husband = husband;
}
}
Husband.java
package cn.itheima.onetoone;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;
@Entity // 声明一个实体类
@Table(name = "tbl_husband") // 描述类与表对应
public class Husband {
@Id
/*
* 定义一个与wife对象的主键映射
*/
@GenericGenerator(name = "myforeignKey", strategy = "foreign", parameters = {
@Parameter(name = "property", value = "wife") })
@GeneratedValue(generator="myforeignKey")
//设置级联保存
@Cascade(CascadeType.SAVE_UPDATE)
private Integer id;
private String name;
//设定一对一对应关系
@OneToOne(mappedBy="husband")
@PrimaryKeyJoinColumn
private Wife wife;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Wife getWife() {
return wife;
}
public void setWife(Wife wife) {
this.wife = wife;
}
}
测试类
HusbandWifeTest.java
package cn.itheima.onetoone;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import cn.itheima.utils.HibernateUtils;
public class HusbandWifeTest {
@Test
public void test1(){
Session session = HibernateUtils.getSession();
Transaction transaction = session.beginTransaction();
try{
Husband husband = new Husband();
husband.setName("小明");
Wife wife = new Wife();
wife.setName("小红");
wife.setHusband(husband);
husband.setWife(wife);
session.save(husband);
transaction.commit();
}catch(Exception e){
transaction.rollback();
}finally{
session.close();
}
}
}
运行结果: