Hibernate 有两种映射实体一对一关联关系的实现方式。共享主键和唯一外键的方式。
共享主键的方式就是限制两个数据表的主键使用相同的值,通过主键形成一对一的关系。
唯一外键的方式一个表的外键和另一个表的唯一主键对应形成一对一的映射关系。
试验名称:将两个表形成共享主键,通过生成生成数据库对应的java类对象和映射文件。
试验步骤:
(1)编写相关的两个实体类,注意classroom类与student类里面分别有相互的属性,但是在创建hml.xml文件后添加进去的所以在java类对数据库的映射中没有该字段。
public class Classroom {
private int cid;
private String cname;
private int cnum;
private Student student;
public Classroom() {
super();
}
public Classroom(int cid, String cname, int cnum, Student student) {
super();
this.cid = cid;
this.cname = cname;
this.cnum = cnum;
this.student = student;
}
public class Student {
private int uid;
private String uname ;
private String uclass;
private Classroom classroom;
public Classroom getClassroom() {
return classroom;
}
public void setClassroom(Classroom classroom) {
this.classroom = classroom;
}
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-11-3 22:57:41 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="pojo.Classroom" table="CLASSROOM">
<id name="cid" type="int">
<column name="CID" />
<generator class="increment">
</generator>
</id>
<property name="cname" type="java.lang.String">
<column name="CNAME" />
</property>
<property name="cnum" type="int">
<column name="CNUM" />
</property>
<!--name表示属性的名称,class表示被关联的类的名字。 cascde="all"表示主控类的所有的操作,对关联类也执行同样的操作
,lazy="false" 表示此关联为立即加载 -->
<one-to-one name="student" class="pojo.Student" cascade="all" lazy="false"></one-to-one>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2018-10-31 8:24:12 by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
<class name="pojo.Student" table="STUDENT">
<id name="uid" type="int">
<column name="uid" />
<!-- 采用foreign标志生成器,直接采用外键的属性值,达到主键共享的目的 -->
<generator class="foreign" >
<param name="property">classroom</param>
</generator>
</id>
<property name="uname" type="java.lang.String">
<column name="uname" />
</property>
<property name="uclass" type="java.lang.String">
<column name="uclass" />
</property>
<!-- name表示属性的名字,class表示被关联的类的名字 constrained="true" 表示当前的主键存在一个外键约束 -->
<one-to-one name="classroom" class="pojo.Classroom" constrained="true" cascade="all"></one-to-one>
</class>
</hibernate-mapping>
测试类:
package test;
import java.util.Iterator;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import pojo.Classroom;
import pojo.Student;
public class Hibernate_test {
@Test
public void test() {
//加载classpath下的hibernate.cfg.xml配置文件
Configuration figure=new Configuration().configure();
//通过会话连接工厂
SessionFactory sessionFactory=figure.buildSessionFactory();
//创建session
Session session =sessionFactory.openSession();
//开启事务
Transaction transaction =session.beginTransaction();
Classroom classroom=new Classroom("xia",45);
Student stu=new Student("tz","meshu");
System.out.println("****8");
/*相互设置关联 classroom-student*/
//注意其中要将 其中student有外键(父项关键字)是classroom所以在删除数据的时候必须要先删完student里面
//所有的数据,其中主键字段需要设置成自增。
classroom.setStudent(stu);
stu.setClassroom(classroom);
/*session.save(classroom); */
//通过Session对象调用session.save(stu)来持久化对象。
session.save(classroom);
/*
String sqlString="from Student";
Query query=session.createQuery(sqlString);
List list=query.list();
Iterator students=list.iterator();
while(students.hasNext()){
Student stu=(Student)students.next();
System.out.println(stu.getUname());
} */
transaction.commit();
session.close();
sessionFactory.close();
}
}