一对一:
大致描述:一个用户只能拥有一张身份证。
数据库建表
/*创建个人表*/
create table person(
id int(11) NOT NULL PRIMARY key auto_increment COMMENT '编号',
pName varchar(20) not null COMMENT '姓名',
sex CHAR(1) default 1 COMMENT '1代表男,0代表女,2代表东方不败'
);
/*创建身份证表*/
create table idCard(
id int(11) NOT NULL PRIMARY key auto_increment COMMENT '编号',
cardNo varchar(18) not null UNIQUE COMMENT '身份证号码',
pId int(11) not null unique COMMENT '个人编号'
)
项目结构:
实体类:
package cn.xxs.entity;
/**
* 创建IdCard类
* @author love
*
*/
public class IdCard {
private Integer id;
private String CardNo;
private Person person;
public IdCard() {
super();
// TODO Auto-generated constructor stub
}
public IdCard(Integer id, String cardNo, Person person) {
super();
this.id = id;
CardNo = cardNo;
this.person = person;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCardNo() {
return CardNo;
}
public void setCardNo(String cardNo) {
CardNo = cardNo;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
@Override
public String toString() {
return "IdCard [id=" + id + ", CardNo=" + CardNo + ", person=" + person + "]";
}
}
package cn.xxs.entity;
/**
* 创建Person类
* @author love
*
*/
public class Person {
private Integer id ;
private String pName;
private String sex;
public Person() {
super();
}
public Person(Integer id, String pName, String sex) {
super();
this.id = id;
this.pName = pName;
this.sex = sex;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getpName() {
return pName;
}
public void setpName(String pName) {
this.pName = pName;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Person [id=" + id + ", pName=" + pName + ", sex=" + sex + "]";
}
}
IdCard.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- hibernate中类和表映射 -->
<hibernate-mapping>
<!-- 类与表映射
name:指类的全路径
table:表
-->
<class name="cn.xxs.entity.Person" table="person">
<!--id:主键的配置
name:类中的 和表对应的主键属性
column:表中的字段
-->
<id name="id" column="id">
<!-- generator:主键生成策略
class:生成策略:自增自己指定
native:让数据库适应
-->
<generator class="native" />
</id>
<!-- property:普通属性和字段映射 -->
<property name="pName" column="pName" />
<property name="sex" column="sex" />
</class>
<class name="cn.xxs.entity.IdCard" table="idCard">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="cardNo" column="cardNo" />
<!-- 配置一对一 unique="true":唯一 -->
<many-to-one name="person" unique="true">
<column name="pId"></column>
</many-to-one>
</class>
</hibernate-mapping>
hibernate.cfg.xml
<?xml version="1.0" encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings 数据库连接 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- SQL dialect 方言 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- Echo all executed SQL to stdout 显示sql语句 -->
<property name="show_sql">true</property>
<!-- 格式化sql语句 -->
<property name="hibernate.format_sql">true</property>
<mapping resource="cn/xxs/entity/IdCard.hbm.xml"/>
</session-factory>
</hibernate-configuration>
工具类:
package cn.xxs.util;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
sessionFactory = new Configuration().configure().buildSessionFactory();
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
测试类:
package cn.xxs.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import cn.xxs.entity.IdCard;
import cn.xxs.entity.Person;
import cn.xxs.util.HibernateUtil;
public class HibernateTest {
// 1.导入hibernate必须的jar包和mysql驱动jar包
// 2.创建类(User)
// 3.创建类的映射文件(User.hbm.xml)
// 4.把User.hbm.xml文件加载到hibernate.cfg.xml核心配置文件中
// 5.测试
//添加数据
@Test
public void test1() {
// 1、和获取SessionFactory
SessionFactory sf = HibernateUtil.getSessionFactory();
// 2、获取session
Session session = sf.openSession();
// 开启事务
Transaction transaction = session.beginTransaction();
//保存数据
// Person person = new Person();
// person.setpName("peter");
// person.setSex("1");
// session.save(person);
Person person = session.get(Person.class, 3);
IdCard idCard = new IdCard();
idCard.setCardNo("52");
idCard.setPerson(person);
session.save(idCard);
transaction.commit();
session.close();
}
}
至此,我们给当前用户添加第二张卡的时候就报错了,证明一个用户只能拥有一张身份证。
一对多:
大致描述:假设一个用户对应多张卡。
数据库:
/*创建个人表*/
create table person(
id int(11) NOT NULL PRIMARY key auto_increment COMMENT '编号',
pName varchar(20) not null COMMENT '姓名',
sex CHAR(1) default 1 COMMENT '1代表男,0代表女,2代表东方不败'
);
/*创建身份证表*/
create table idCard2(
id int(11) NOT NULL PRIMARY key auto_increment COMMENT '编号',
cardNo varchar(18) not null UNIQUE COMMENT '身份证号码',
pId int(11) not null COMMENT '个人编号'
)
项目结构:
实体类:
package cn.xxs.entity;
/**
* 创建IdCard类
* @author love
*
*/
public class IdCard {
private Integer id;
private String CardNo;
public IdCard() {
super();
// TODO Auto-generated constructor stub
}
public IdCard(Integer id, String cardNo) {
super();
this.id = id;
CardNo = cardNo;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCardNo() {
return CardNo;
}
public void setCardNo(String cardNo) {
CardNo = cardNo;
}
@Override
public String toString() {
return "IdCard [id=" + id + ", CardNo=" + CardNo + "]";
}
}
package cn.xxs.entity;
import java.util.Set;
/**
* 创建Person类
* @author love
*
*/
public class Person {
private Integer id ;
private String pName;
private String sex;
private Set<IdCard> idCard;
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(Integer id, String pName, String sex, Set<IdCard> idCard) {
super();
this.id = id;
this.pName = pName;
this.sex = sex;
this.idCard = idCard;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getpName() {
return pName;
}
public void setpName(String pName) {
this.pName = pName;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Set<IdCard> getIdCard() {
return idCard;
}
public void setIdCard(Set<IdCard> idCard) {
this.idCard = idCard;
}
@Override
public String toString() {
return "Person [id=" + id + ", pName=" + pName + ", sex=" + sex + ", idCard=" + idCard + "]";
}
}
Person.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- hibernate中类和表映射 -->
<hibernate-mapping>
<!-- 类与表映射
name:指类的全路径
table:表
-->
<class name="cn.xxs.entity.Person" table="person">
<!--id:主键的配置
name:类中的 和表对应的主键属性
column:表中的字段
-->
<id name="id" column="id">
<!-- generator:主键生成策略
class:生成策略:自增自己指定
native:让数据库适应
-->
<generator class="native" />
</id>
<!-- property:普通属性和字段映射 -->
<property name="pName" column="pName" />
<property name="sex" column="sex" />
<!-- 在一的一方配置多的一方的集合 class:集合对应的属性名字 -->
<set name="idCard">
<key column="pId"></key>
<one-to-many class="cn.xxs.entity.IdCard"/>
</set>
</class>
<class name="cn.xxs.entity.IdCard" table="idCard2">
<id name="id" column="id">
<generator class="native" />
</id>
<property name="cardNo" column="cardNo" />
</class>
</hibernate-mapping>
hibernate.cfg.xml
与一对一相比只这里不一样<mapping resource="cn/xxs/entity/Person.hbm.xml"/>
工具类与一对一 一样
测试类:
package cn.xxs.test;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import cn.xxs.entity.IdCard;
import cn.xxs.entity.Person;
import cn.xxs.util.HibernateUtil;
public class HibernateTest {
// 1.导入hibernate必须的jar包和mysql驱动jar包
// 2.创建类(User)
// 3.创建类的映射文件(User.hbm.xml)
// 4.把User.hbm.xml文件加载到hibernate.cfg.xml核心配置文件中
// 5.测试
@Test
public void test1() {
// 1、和获取SessionFactory
SessionFactory sf = HibernateUtil.getSessionFactory();
// 2、获取session
Session session = sf.openSession();
Person person = session.get(Person.class, 3);
System.out.println(person.toString());
Set<IdCard> idCard = person.getIdCard();
System.out.println("--------------------");
Iterator<IdCard> it = idCard.iterator();
while(it.hasNext()) {
System.out.println(it.next().toString());
}
session.close();
}
}
至此,运行结果:
表明查出一人两张卡。