Hibernate 父子关系的级联保存

本文介绍了一个简单的用户表和学生表的关系模型及其在Hibernate框架中的对象-关系映射实现方式,包括对应的Java实体类定义和XML配置文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  rel="File-List" href="file:///C:%5CDOCUME%7E1%5Ctw%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C03%5Cclip_filelist.xml">

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. }
rel="File-List" href="file:///C:%5CDOCUME%7E1%5Ctw%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C03%5Cclip_filelist.xml">

子表:

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. }
rel="File-List" href="file:///C:%5CDOCUME%7E1%5Ctw%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C03%5Cclip_filelist.xml">

(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>
rel="File-List" href="file:///C:%5CDOCUME%7E1%5Ctw%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C04%5Cclip_filelist.xml">

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>
rel="File-List" href="file:///C:%5CDOCUME%7E1%5Ctw%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C04%5Cclip_filelist.xml">


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. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值