分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

hibernate one2many (单向关联)

发布时间:2023-09-06 01:20责任编辑:蔡小小关键词:暂无标签

Classes类:

package com.cnblogs.hibernate_first;import java.util.Set;public class Classes { ???private int id; ???private String name; ???????//hibernate对Set进行了扩展,可以延时加载,在需要的时候才需要查询SET。比如有1000个学生,当需要的时候才进行加载 ???private Set students; ???public Set getStudents() { ???????return students; ???} ???public void setStudents(Set students) { ???????this.students = students; ???} ???public int getId() { ???????return id; ???} ???public void setId(int id) { ???????this.id = id; ???} ???public String getName() { ???????return name; ???} ???public void setName(String name) { ???????this.name = name; ???}}

Student:

public class Student { ???private int id; ???private String name; ???public int getId() { ???????return id; ???} ???public void setId(int id) { ???????this.id = id; ???} ???public String getName() { ???????return name; ???} ???public void setName(String name) { ???????this.name = name; ???}}

classes.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!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.cnblogs.hibernate_first"> ???<class name="Classes" table="t_classes"> ???????<id name="id" column="t_id"> ???????????<generator class="native"></generator> ???????</id> ???????<property name="name" column="t_name" length="30"/> ???????<set name="students"> ???????????<key column="classesid"></key> ???????????<one-to-many class="com.cnblogs.hibernate_first.Student"/> ???????</set> ???</class></hibernate-mapping>

student.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?><!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.cnblogs.hibernate_first"> ???<class name="Student" table="t_student"> ???????<id name="id" column="t_id"> ???????????<generator class="native"></generator> ???????</id> ???????<property name="name" column="t_name" length="30"/> ???</class></hibernate-mapping>

测试类:

package com.cnblogs.hibernate_first;import java.util.HashSet;import java.util.Iterator;import java.util.Set;import org.hibernate.Session;import junit.framework.TestCase;public class One2ManyTest extends TestCase { ???public void testSave1() { ???????Session session = null; ???????try { ???????????session = HibernateUtils.getSession(); ???????????session.beginTransaction(); ???????????// 建立关联 ???????????Student student1 = new Student(); ???????????student1.setName("张三"); ???????????????????????Student student2 = new Student(); ???????????student2.setName("李四"); ???????????Classes classes = new Classes(); ???????????classes.setName("动力节点"); ???????????Set<Student> students = new HashSet<Student>(); ???????????students.add(student1); ???????????students.add(student2); ???????????classes.setStudents(students); ???????????//因为student不是持久化状态,他是Transient状态 ???????????session.save(classes); ???????????session.getTransaction().commit(); ???????} catch (Exception e) { ???????????e.printStackTrace(); ???????????session.getTransaction().rollback(); ???????} finally { ???????????HibernateUtils.closeSession(session); ???????} ???} ???????public void testSave2() { ???????Session session = null; ???????try { ???????????session = HibernateUtils.getSession(); ???????????session.beginTransaction(); ???????????// 建立关联 ???????????Student student1 = new Student(); ???????????student1.setName("张三"); ???????????session.save(student1); ???????????????????????Student student2 = new Student(); ???????????student2.setName("李四"); ???????????session.save(student2); ???????????????????????Classes classes = new Classes(); ???????????classes.setName("动力节点"); ???????????Set<Student> students = new HashSet<Student>(); ???????????students.add(student1); ???????????students.add(student2); ???????????classes.setStudents(students); ???????????//因为student不是持久化状态,他是Transient状态 ???????????session.save(classes); ???????????session.getTransaction().commit(); ???????} catch (Exception e) { ???????????e.printStackTrace(); ???????????session.getTransaction().rollback(); ???????} finally { ???????????HibernateUtils.closeSession(session); ???????} ???} ???public void testLoad1() { ???????Session session = null; ???????try { ???????????session = HibernateUtils.getSession(); ???????????session.beginTransaction(); ???????????Classes classes = (Classes)session.load(Classes.class, 1); ???????????System.out.println("Classes.name = " + classes.getName()); ???????????Set students = classes.getStudents(); ???????????for(Iterator iter = students.iterator();iter.hasNext();){ ???????????????Student student = (Student)iter.next(); ???????????????System.out.println("Student in Classes " + student.getName()); ???????????} ???????????session.getTransaction().commit(); ???????} catch (Exception e) { ???????????e.printStackTrace(); ???????????session.getTransaction().rollback(); ???????} finally { ???????????HibernateUtils.closeSession(session); ???????} ???}}

hibernate 一对多的关联映射(单向 Classes ——》Student)
hibernate对Set进行了扩展,可以延时加载,在需要的时候才需要查询SET。比如有1000个学生,当需要的时候才进行加载
一对多和多对一的映射原理是一样的,都是在多的一端加入一个外键指向一的一端
他们的区别在于维护的关系不用
多对一维护的关系:多指向一的关系,如果维护了多指向一的关系,那么加载多的时候会把一加载上来。
一对多维护的关系:一指向多的关系,如果维护了一指向多的关系,那么加载一的时候会把一加载上来。

在一的一端维护关系存在缺陷
*因为多的一端Student不知道Classes的存在(也就是Student没有维护与Classes的关系),所以在保存Student的时候关系字段Classid为null,
如果将该关系字段设置为非空,则将无法保存数据。
*另外因为Student不维护关系,而Classes维护关系,Classes就会发出多余的update语句,保证Classes与Student有关系,,这样加载Classes的
时候,才能把该Classes对应的学生集合加载上来。

hibernate one2many (单向关联)

原文地址:http://www.cnblogs.com/Juli/p/7743938.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved