hibernate的级联-----one-to-one

来源:互联网 发布:pdf骑缝章软件 编辑:程序博客网 时间:2024/05/01 19:32

以下示例均为双向关联,

一对一:

        学生证表和学生表,学生证表中有学生的id,理论上,一对一完全可以合成为一张表,

学生证表对应的entity:

package com.entity;public class Paper {private Integer id;private String desc;private Student student;public Paper() {super();}public Paper(String desc) {super();this.desc = desc;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}public Student getStudent() {return student;}public void setStudent(Student student) {this.student = student;}}

学生表对应的entity:

package com.entity;public class Student {private Integer id;private String name;private Paper paper;public Student() {super();}public Student(String name) {super();this.name = name;}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 Paper getPaper() {return paper;}public void setPaper(Paper paper) {this.paper = paper;}}

学生证表Paper.hbm.xml:

表中字段设置,实体类和数据库表字段一一对应,值得一提的是,hibernate提供了主键的自增,如果在这里设置自增的话,增加数据的时候,会先执行一条判断当前数据库主键的最大值,然后从最大值+1保存,这个机制比数据库自身的sequence要好用得多;

数据库是不会判断两个表是一对一还是多对多的,数据库只认外键,就是说设置有外键的表为多的一方,而另外的一方为对应的一的一方,因此此处学生证表中设置为many-to-one,

与数据库相照应,

<?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-mapping package="com.entity"><class name="Paper" table="PAPER"><id name="id" type="integer" column="ID" ><generator class="increment"/></id><property name="desc" column="STU_DESC"></property><many-to-one name="student" class="Student" column="STU_ID" unique-key="true" cascade="all"></many-to-one></class></hibernate-mapping>

学生表的xml:

<hibernate-mapping package="com.entity"><class name="Student" table="STUDENT"><id name="id" type="integer" column="ID" ><generator class="increment"/></id><property name="name" column="NAME"></property><one-to-one name="paper" class="Paper"></one-to-one></class></hibernate-mapping>

下面是测试类:

package com.test;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import com.entity.Paper;import com.entity.Student;public class TestOne2One {public static void main(String[] args) {TestOne2One test = new TestOne2One();test.add();}public void add() {Configuration config = new Configuration().configure();SessionFactory factory = config.buildSessionFactory();Session session = factory.openSession();Student student = new Student("李四");Paper paper = new Paper();paper.setDesc("1010111021545");paper.setStudent(student);//student.setPaper(paper);Transaction tr = session.beginTransaction();//session.save(student);//如果想用级联的话,需要从从表寻找主表,在从表的配置中,设置cascade;//不用级联的话,可以双向关联,然后save主表,即studentsession.save(paper);tr.commit();session.close();factory.close();}public void query(){Configuration config = new Configuration().configure();SessionFactory factory = config.buildSessionFactory();Session session = factory.openSession();Paper paper = (Paper) session.get(Paper.class, 1);Student student = paper.getStudent();System.out.println(student.getName());session.close();factory.close();}public void delete(){Configuration config = new Configuration().configure();SessionFactory factory = config.buildSessionFactory();Session session = factory.openSession();Transaction tr = session.beginTransaction();Paper paper = (Paper) session.get(Paper.class, 2);session.delete(paper);tr.commit();session.close();factory.close();}}


0 0