hibernate的級聯-----one-to-one

以下示例均爲雙向關聯,

一對一:

        學生證表和學生表,學生證表中有學生的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主表,即student
		session.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();	
	}
	
}


發佈了28 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章