现在的位置: 首页 > 综合 > 正文

Hibernate 父子关系的级联保存

2013年05月27日 ⁄ 综合 ⁄ 共 5922字 ⁄ 字号 评论关闭
 

1 对应表及对象

父表:user

create table user(

       id
int auto_increment primary key,

       username
char(15),

       password
char(15)

)

 

父对象:

  1. package com.ckcs.db.entry;
  2. import java.util.HashSet;
  3. import java.util.LinkedList;
  4. import java.util.Set;
  5. /**
  6.  * User entity.
  7.  * 
  8.  * @author MyEclipse Persistence Tools
  9.  */
  10. public class User implements java.io.Serializable {
  11.     // Fields
  12.     private Integer id;
  13.     private String password;
  14.     private String username;
  15.     private Set students = new HashSet(0);
  16.     // Constructors
  17.     /** default constructor */
  18.     public User() {
  19.     }
  20.     /** full constructor */
  21.     public User(String password, String username, Set students) {
  22.         this.password = password;
  23.         this.username = username;
  24.         this.students = students;
  25.     }
  26.     // Property accessors
  27.     public Integer getId() {
  28.         return this.id;
  29.     }
  30.     public void setId(Integer id) {
  31.         this.id = id;
  32.     }
  33.     public String getPassword() {
  34.         return this.password;
  35.     }
  36.     public void setPassword(String password) {
  37.         this.password = password;
  38.     }
  39.     public String getUsername() {
  40.         return this.username;
  41.     }
  42.     public void setUsername(String username) {
  43.         this.username = username;
  44.     }
  45.     public Set getStudents() {
  46.         return this.students;
  47.     }
  48.     public void setStudents(Set students) {
  49.         this.students = students;       
  50.     }
  51.     public Student getOnlyStudent() {
  52.         Student student = null;
  53.         if (students.size() > 0) {
  54.             student = (Student) new LinkedList(students).getFirst();
  55.         }
  56.         return student;
  57.     }
  58.     public String toString() {
  59.         Student student = null;
  60.         if (students.size() > 0) {
  61.             student = (Student) new LinkedList(students).getFirst();
  62.         }
  63.         return "user: username = " + username + " password = " + password
  64.                 + " students: " + student;
  65.     }
  66. }


子表:

create table student(

       stuId
int primary key,

       address
char(50),

       foreign
key (stuId) references user(id)

)

 

子对象:

  1. package com.ckcs.db.entry;
  2. /**
  3.  * Student entity.
  4.  * 
  5.  * @author MyEclipse Persistence Tools
  6.  */
  7. public class Student implements java.io.Serializable {
  8.     // Fields
  9.     private Integer stuId;
  10.     private User user;
  11.     private String address;
  12.     // Constructors
  13.     /** default constructor */
  14.     public Student() {
  15.     }
  16.     /** minimal constructor */
  17.     public Student(Integer stuId, User user) {
  18.         this.stuId = stuId;
  19.         this.user = user;
  20.     }
  21.     /** full constructor */
  22.     public Student(Integer stuId, User user, String address) {
  23.         this.stuId = stuId;
  24.         this.user = user;
  25.         this.address = address;
  26.     }
  27.     // Property accessors
  28.     public Integer getStuId() {
  29.         return this.stuId;
  30.     }
  31.     public void setStuId(Integer stuId) {
  32.         this.stuId = stuId;
  33.     }
  34.     public User getUser() {
  35.         return this.user;
  36.     }
  37.     public void setUser(User user) {
  38.         this.user = user;
  39.     }
  40.     public String getAddress() {
  41.         return this.address;
  42.     }
  43.     public void setAddress(String address) {
  44.         this.address = address;
  45.     }
  46.     public String toString() {
  47.         return "id = " + stuId + " address = " + address;
  48.     }
  49. }


(2)对应的hibernate o/r映射文件

User.hbm.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <!-- 
  5.     Mapping file autogenerated by MyEclipse Persistence Tools
  6. -->
  7. <hibernate-mapping>
  8.     <class name="com.ckcs.db.entry.User" table="user" catalog="hibernate">
  9.         <id name="id" type="java.lang.Integer">
  10.             <column name="id" />
  11.             <generator class="native"></generator>
  12.         </id>
  13.         <property name="password" type="java.lang.String">
  14.             <column name="password" length="50" />
  15.         </property>
  16.         <property name="username" type="java.lang.String">
  17.             <column name="username" length="50" />
  18.         </property>
  19.         <set name="students" inverse="true" cascade="all">
  20.             <key>
  21.                 <column name="stuId" not-null="true" unique="true" />
  22.             </key>
  23.             <one-to-many class="com.ckcs.db.entry.Student" />
  24.         </set>
  25.     </class>
  26. </hibernate-mapping>


Student.hbm.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <!-- 
  5.     Mapping file autogenerated by MyEclipse Persistence Tools
  6. -->
  7. <hibernate-mapping>
  8.     <class name="com.ckcs.db.entry.Student" table="student" catalog="hibernate">
  9.         <id name="stuId" type="java.lang.Integer">
  10.             <column name="stuId" />
  11.             <!-- 表示主键是个外键,与子关联的的对象是父对象是user,这样在插入student时将会使用user的主键作为自己的主键-->
  12.             <generator class="foreign">
  13.                 <param name="property">user</param>
  14.             </generator>
  15.             
  16.         </id>
  17.         <many-to-one name="user" class="com.ckcs.db.entry.User" update="false" insert="false" fetch="select">
  18.             <column name="stuId" not-null="true" unique="true" />
  19.         </many-to-one>
  20.         <property name="address" type="java.lang.String">
  21.             <column name="address" length="50" />
  22.         </property>
  23.     </class>
  24. </hibernate-mapping>



3)测试:

  1. package com.ckcs.test;
  2. import org.hibernate.Session;
  3. import com.ckcs.HibernateSessionFactory;
  4. import com.ckcs.db.entry.Student;
  5. import com.ckcs.db.entry.User;

  6. public class Test {
  7.     public void saveUser() {
  8.         Session session = HibernateSessionFactory.getSession();
  9.         session.beginTransaction();
  10.            
  11.         User user = new User();
  12.         user.setUsername("小王");
  13.         user.setPassword("000");
  14.         
  15.         Student studnet = new Student();        
  16.         studnet.setAddress("小路旁");

  17.         //子类关联父类
  18.         studnet.setUser(user);
  19.         //父类关联子类
  20.         user.getStudents().add(studnet);

  21.         session.save(user);
  22.         session.getTransaction().commit();
  23.     }

  24.     public static void main(String[] args) {
  25.         Test test = new Test();
  26.         test.saveUser();
  27.     }
  28. }

抱歉!评论已关闭.