在培訓系統中,我們經常會爲每一個學員,分配一個所屬登錄帳號,對應的表結構設計如下:
圖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); } }
發出的sqlHibernate: update t_student set student_name=?, age=? where student_id=?
Student這方不負責維護關聯字段,不會發送更新User 的語句