hibernate 之 9.one2one雙向

在培訓系統中,我們經常會爲每一個學員,分配一個所屬登錄帳號,對應的表結構設計如下:


圖1:培訓系統表結構


t_student:

學員信息表,存儲學員的基本信息,如:姓名、年齡、身份證號、地址等等


t_user:

用戶表,儲系統用戶信息,如:登錄帳號、密碼等

從圖1中,知道 它通過student_id來關聯 t_studnet


面向對象類關係


CRUD:

配置:

User類

package com.demo.model;

/**用戶信息
 * @author wobendiankun
 *2014-10-29 下午11:05:26
 */
public class User {
	/**
	 *用戶Id 
	 */
	private int userId;
	/**
	 * 用戶名
	 */
	private String userName;
	/**
	 * 密碼
	 */
	private String password;
	
	private Student student ;
	
	
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Student getStudent() {
		return student;
	}
	public void setStudent(Student student) {
		this.student = student;
	}
	
}

Student類

package com.demo.model;

import java.io.UnsupportedEncodingException;
import java.util.Set;

/**學生信息
 * @author wobendiankun
 *2014-10-19 下午08:54:29
 */
public class Student {
	private int studentId ;
	private String studentName ;
	private int age;
	private Set<Certificate> certificates ;
	private User user;
	public int getStudentId() {
		return studentId;
	}
	public void setStudentId(int studentId) {
		this.studentId = studentId;
	}
	public String getStudentName() {
		return studentName;
	}
	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		String str="";
		if(studentName!=null){
			try {
				str=new String(studentName.getBytes("UTF-8"));
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
		return "Student [studentId=" + studentId + ", studentName="
				+ str + ", age=" + age + "]";
	}
	public Set<Certificate> getCertificates() {
		return certificates;
	}
	public void setCertificates(Set<Certificate> certificates) {
		this.certificates = certificates;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	
}

User.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-mapping >

	<class name="com.demo.model.User" table="t_user">
		<id name="userId" column="user_id">
			<generator class="sequence">
				<param name="sequence">SEQ_T_USER</param>
			</generator>
		</id>
		<property name="userName" column="user_name" />
		<property name="password" />
		<many-to-one name="student" column="student_id" unique="true">
		</many-to-one>
	</class>
</hibernate-mapping>

<many-to-one name="student" column="student_id" unique="true"> ,通過 unique="true" 來說明1對1關係,並由這方來維護關聯字段


Student.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-mapping >

	<class name="com.demo.model.Student" table="t_student">
		<id name="studentId" column="student_id">
			<generator class="sequence">
				<param name="sequence">SEQ_T_STUDENT</param>
			</generator>
		</id>
		<property name="studentName" column="student_name" />
		<property name="age" />
		
		<set name="certificates" lazy="extra" inverse="true">
			<key column="student_id"></key>
			<one-to-many class="com.demo.model.Certificate"/>
		</set>
		<one-to-one name="user" property-ref="student"></one-to-one>
	</class>
</hibernate-mapping>

<one-to-one name="user" property-ref="student"></one-to-one>  ,

name爲Student類的成員變量user,

property-ref爲User類的成員變量student


add:

@Test
	public void addTest(){
		Student student=new Student();
		student.setStudentName("大寶");
		student.setAge(45);
		
		User user=new User();
		user.setUserName("db");
		user.setPassword("111111");
		//設置雙向關係
		user.setStudent(student);
		student.setUser(user);
		
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			session.save(student);
			session.save(user);
			session.getTransaction().commit();
		} catch (Exception e) {
			session.getTransaction().rollback();
			e.printStackTrace();
		} finally {
			HibernateUtil.closeSession(session);
		}
	}


發出的sql:

Hibernate: insert into t_student (student_name, age, student_id) values (?, ?, ?)
Hibernate: insert into t_user (user_name, password, student_id, user_id) values (?, ?, ?, ?)

update

@Test
	public void updateTest(){
		User user=new User();
		user.setUserId(21);
		user.setUserName("dddd");
		Student student=new Student();
		student.setStudentId(102);
		student.setStudentName("二寶");
		//設置關聯關係
		student.setUser(user);
		
		Session session = null;
		try {
			session = HibernateUtil.openSession();
			session.beginTransaction();
			session.update(student);
			session.getTransaction().commit();
		} catch (Exception e) {
			session.getTransaction().rollback();
			e.printStackTrace();
		} finally {
			HibernateUtil.closeSession(session);
		}
	}

發出的sql

Hibernate: update t_student set student_name=?, age=? where student_id=?

Student這方不負責維護關聯字段,不會發送更新User 的語句


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