hibernate 一對一關係映射配置

  1. hibernate一對一共享主鍵映射是如何配置?一對一關係外鍵映射如何配置?

    下面做個簡單測試。

  2. 導入jar包

  3. 配置hibernate.cfg.xml文件

  4. 寫相關實體

  5. 數據庫建表

  6. 映射文件配置

  7. 測試


第一個測試是一對一共享主鍵

  1. hibernate.cfg.xml配置

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
    <session-factory>
    	<!-- 添加配置信息:數據庫連接參數 -->
		<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
		<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:xe</property>
		<property name="hibernate.connection.username">zt</property>
		<property name="hibernate.connection.password">zt</property>
		
		<!-- 添加配置信息:hibernate 自身屬性
			dialect :方言,指定數據類型,hibernate可以針對不同的數據庫做出相應的優化
		 -->
		
		<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
		<property name="hibernate.show_sql">true</property>
		<property name="hibernate.format_sql">true</property>
		
		<!-- 爲getCurrentSession增加配置 -->
		<property name="current_session_context_class">thread</property>
		
		
		<mapping resource="person.cfg.xml"/>
    </session-factory>
</hibernate-configuration>

2.person 實體,在這裏粗略表達個人

 passport實體,粗略表示護照。

person 實體代碼

package com.hibernate.entity;

public class Person {
	
	private Integer id;
	private String name;
	private String address;
	
	// 護照信息
	private Passport passport;

	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 String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public Passport getPassport() {
		return passport;
	}

	public void setPassport(Passport passport) {
		this.passport = passport;
	}


	public Person(Integer id, String name, String address) {
		super();
		this.id = id;
		this.name = name;
		this.address = address;
	}

	public Person() {
		super();
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", address=" + address + "]";
	}
	
}

passport實體代碼

package com.hibernate.entity;

public class Passport {
	
	private Integer id;
	private Integer expire;
	private String note;
	// 個人信息
	private Person person;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Integer getExpire() {
		return expire;
	}

	public void setExpire(Integer expire) {
		this.expire = expire;
	}

	public String getNote() {
		return note;
	}

	public void setNote(String note) {
		this.note = note;
	}

	public Person getPerson() {
		return person;
	}

	public void setPerson(Person person) {
		this.person = person;
	}


	public Passport(Integer id, Integer expire, String note) {
		super();
		this.id = id;
		this.expire = expire;
		this.note = note;
	}

	public Passport() {
		super();
	}

	@Override
	public String toString() {
		return "Passport [id=" + id + ", expire=" + expire + ", note=" + note + "]";
	}
	
}

3.數據庫建表

CREATE TABLE PERSON(
	ID NUMBER(2) PRIMARY KEY,
	NAME VARCHAR2(20),
	address VARCHAR2(20)
)

 
CREATE TABLE PASSPORT(
	ID NUMBER(2) PRIMARY KEY references PERSON(ID),
	expire number(1),
	note VARCHAR2(20)
)

4.映射文件配置

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	
	<class name="com.hibernate.entity.Person" table="person">
		<id name="id" column="id" type="java.lang.Integer">
			 <generator class="increment"></generator>
		</id>
		<property name="name" column="name" type="java.lang.String"></property>
		<property name="address" column="address" type="java.lang.String"></property>
		<!-- 
			關係屬性:passport
			表關聯配置要點:
			1.關係屬性名
			2.關係對方
			3.關係中的外鍵
				one-to-one 默認行爲:在進行表連接時,將雙方的主鍵相連
			4.級聯,對關聯表進行同級操作(查詢操作不受級聯限制)
				默認:none 不級聯
				save-update :當更新當前方時,級聯更新對方
				delete :當刪除當前方時,級聯刪除對方
				all : 所有操作都級聯
		 -->
		<one-to-one name="passport" class="com.hibernate.entity.Passport" cascade="save-update"></one-to-one>
	</class>
	
	<class name="com.hibernate.entity.Passport" table="passport">  
		<id name="id" column="id" type="java.lang.Integer">
			 <!-- 
			 	當前的主鍵是外鍵,要從關係對方中來
			  -->
			  <generator class="foreign">
			  		<param name="property">person</param>
			  </generator>
		</id>
		<property name="expire"></property>
		<property name="note"></property>
		
		<!-- constrained: true 表示爲從表方 -->
		<one-to-one name="person" class="com.hibernate.entity.Person" cascade="none" constrained="true"></one-to-one>
	</class>
</hibernate-mapping>

5.HibUtil session工具類

package com.hibernate.util;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibUtil {
	private static Configuration cfg = new Configuration().configure();
	private static SessionFactory factory = cfg.buildSessionFactory();
	
	public static Session getSession(){
		return factory.getCurrentSession();
	}
	public static Session openSession(){
		return factory.openSession();
	}
}

6.測試插入數據

@Test
	public void insert(){
		Session session = HibUtil.getSession();
		Transaction tx = session.beginTransaction();
		
		Person person = new Person(null, "小明", "河南");
		Passport passport = new Passport(null, 3, "美國");
		
		person.setPassport(passport);
		passport.setPerson(person);
		
		session.save(person);
		tx.commit();
	}

7.測試查詢

@Test
	public void query(){
		Session session = HibUtil.getSession();
		Transaction tx = session.beginTransaction();
		
		Person person = (Person)session.get(Person.class, 1);
		System.out.println(person.getPassport());
		System.out.println(person);
		
		tx.commit();
	}

8測試更新

@Test
	public void update(){
		Session session = HibUtil.getSession();
		Transaction tx = session.beginTransaction();
		Person person = (Person)session.get(Person.class, 1);
		Passport passport = person.getPassport();

		// 修改數據
		person.setName("小強");
		person.setAddress("china");
		
		passport.setExpire(1);
		passport.setNote("中國");
		
		session.update(person);
		
		tx.commit();
	}

9.刪除

@Test
	public void delete(){
		Session session = HibUtil.getSession();
		Transaction tx = session.beginTransaction();
		/* 1.單獨刪除從表 ,直接查詢出來,刪除就可以了。
		 *  Passport passport = (Passport)session.get(Passport.class, 1);
			session.delete(passport);
		 * 
		*  2.刪除主表,級聯刪除從表
		*   注意:要在關係映射中 添加級聯配置 
		*  <one-to-one name="passport" class="com.hibernate.entity.Passport" cascade="save-update,delete"></one-to-one>
		*/
		Person person = (Person)session.get(Person.class, 1);
		session.delete(person);
		
		tx.commit();
	}


第二個是一對一外鍵關聯關係

  1. 建立二個表

create table STUDENT(
	id NUMBER(2) primary key,
  age number(2),
  name nvarchar2(20)
)



create table COMPLATE(
	id NUMBER(2) primary key,
  price number(5),
  brand nvarchar2(20),
  stu_id references STUDENT(id) unique
)

2。student 實體

package com.hibernate.entity;

public class Student {
	
	private Integer id;
	private Integer age;
	private String name;
	
	private Compoter compoter;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Compoter getCompoter() {
		return compoter;
	}

	public void setCompoter(Compoter compoter) {
		this.compoter = compoter;
	}

	@Override
	public String toString() {
		return "Student [id=" + id + ", age=" + age + ", name=" + name + ", compoter=" + compoter + "]";
	}

	public Student(Integer id, Integer age, String name) {
		super();
		this.id = id;
		this.age = age;
		this.name = name;
	}

	public Student() {
		super();
	}
	
}

3. compoters實體

package com.hibernate.entity;

public class Compoter {
	
	private Integer id;
	private Integer price;
	private String brand;
	
	private Student student;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public Integer getPrice() {
		return price;
	}

	public void setPrice(Integer price) {
		this.price = price;
	}

	public String getBrand() {
		return brand;
	}

	public void setBrand(String brand) {
		this.brand = brand;
	}

	

	public Student getStudent() {
		return student;
	}

	public void setStudent(Student student) {
		this.student = student;
	}

	@Override
	public String toString() {
		return "Compoter [id=" + id + ", price=" + price + ", brand=" + brand + "]";
	}


	public Compoter(Integer id, Integer price, String brand) {
		super();
		this.id = id;
		this.price = price;
		this.brand = brand;
	}

	public Compoter() {
		super();
	}
	
}

4.最重要的配置文件來了 student.cfg.xml

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.hibernate.entity">
	
	<class name="Student" table="student">
		<id name="id">
			<generator class="increment"></generator>
		</id>
		
		<property name="age"/>
		<property name="name"/>
		
		//
		<one-to-one name="compoter" class="Compoter" property-ref="student" 
		cascade="all"></one-to-one>
	</class>
	
	<class name="Compoter" table="complate">
		<id name="id">
			<generator class="increment"></generator>
		</id>
		
		<property name="brand"/>
		<property name="price"/>
		 
		<many-to-one unique="true" name="student" class="Student" 
		column="stu_id" cascade="none"></many-to-one>
	</class>
</hibernate-mapping>


5測試,這裏只測試一個插入,查詢,刪除,更新都和上面一樣用法。

/**
	 * 1.插入從表
	 * 2.插入主表
	 * 3.級聯插入
	 */
	@Test
	public void inset(){
		Session session = HibUtil.getSession();
		Transaction tx = session.beginTransaction();
		
		/* 插入主表 */
		/*Student stu = new Student(null, 20, "zs");
		session.save(stu);*/
		
		/* 插入從表,數據庫要是沒有數據,自己先先添加一條  */
		/*
		Student student = (Student)session.get(Student.class, 1);
		Compoter compoter = new Compoter(null, 99, "LX");
		compoter.setStudent(student);
		session.save(compoter);
		*/
		
		/* 級聯插入 */
		Student student = new Student(null, 19, "刷刷");
		Compoter compoter = new Compoter(null, 99, "聯想");
		
		student.setCompoter(compoter);
		compoter.setStudent(student);
		
		session.save(student);
		tx.commit();
	}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章