`
wlzjdm
  • 浏览: 26339 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

hibernate的思考及一对多关系实现的代码

阅读更多

断断续续的看hibernate有好几天了。每当学了一点点的知识,我都要思考hibernate的价值、或者站在另一个角度去思考。还好了,让我更加深刻的理解了hibernate的作用。

其实hibernate就相当于java的专有数据库。根据java EE的特性——多用户、大量访问,那么自然就不能手工的直接去操作数据库了,因为当我们手动的去操作的时候很多时候都会造成一些冗余操作,你如果给数据库发送两个请求,那么数据库也就会不折不扣的执行两个操作,然而令人悲哀的是:数据库是存储在硬盘上的,需要通过io进行操作,那么也就会使得网站的数据库操作部分变成一个瓶颈。那么就这样hibernate诞生了,它提供了一个虚拟的java数据库,让我们“做好了真正想要做的‘所有’决定”,然后一次性的发送给数据库,一次性完成操作,无意这样就会减少很多的io操作,让我们的系统变得更加的速度。

以上是我理解的hibernate的价值。暂不思考其在项目分模块、分层方面的价值。

其实我觉得学习hibernate的时候,要先复习一下数据库,从数据库的角度去学习hibernate,数据库中所有的操作在hibernate中都会体现,这样才能使得我们变成知识的主动接受者。

回归正题,这次要总结的是hibernate中的一对多双向关系。

所谓的一对多就是,甲方可以包含多个乙方的引用,而乙方只可以包含有一个甲方的引用。所以呢,我们就需要先建立两个模型:student类和course类(此处并不合适,因为一个学生可以选择多门课,而且一门课也可由多个学生选择,此处仅仅为了表达如何的实现hibernate的一对多)。

代码:

注:代码很简单、基本就不加注释了。。。

Student.java

package com.dong.model;

import java.util.List;
import java.util.Set;

public class Student
{
	private Long id;
	private String name;
	private int age;
	private Set<Course> courses;
	
	public Student(){}
	
	public Student(Long id, String name, int age, Set<Course> courses)
	{
		this.id = id;
		this.name = name;
		this.age = age;
		this.courses = courses;
	}

	public Long getId()
	{
		return id;
	}
	public void setId(Long id)
	{
		this.id = id;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public int getAge()
	{
		return age;
	}
	public void setAge(int age)
	{
		this.age = age;
	}
	public Set<Course> getCourses()
	{
		return courses;
	}
	public void setCourses(Set<Course> courses)
	{
		this.courses = courses;
	}
	
	
}

 Course.java

package com.dong.model;

public class Course
{
	private Long id;
	private String name;
	private Student student;
	
	public Course(){}
	
	public Course(Long id, String name, Student student)
	{
		this.id = id;
		this.name = name;
		this.student = student;
	}

	public Long getId()
	{
		return id;
	}
	public void setId(Long id)
	{
		this.id = id;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public Student getStudent()
	{
		return student;
	}
	public void setStudent(Student student)
	{
		this.student = student;
	}
	
	
}

hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>

    <session-factory>
    <!-- 连接的URL -->
		<property name="connection.url">
			jdbc:mysql://localhost:3306/hibernate
		</property>

		<!-- 登录数据库的用户名 -->
		<property name="connection.username">root</property>

		<!-- 登录数据库的密码 -->
		<property name="connection.password">wlzjdm</property>

		<!-- 连接数据库的驱动 -->
		<property name="connection.driver_class">
			com.mysql.jdbc.Driver
		</property>

		<!-- 采用的会话方言,也就是告诉hibernate此次连接的是什么数据库,采用哪种数据库语言 -->
		<property name="dialect">
			org.hibernate.dialect.MySQLDialect
		</property>

		<!-- 是否打印hibernate自动生成的SQL语句,为了方便测试,此处设置为true,当我们部署的时候应该设置为false -->
		<property name="show_sql">true</property>

		<!-- 模型与数据库表的关联配置 -->
		<mapping resource="Student.hbm.xml"/>
		<mapping resource="Course.hbm.xml"/>
    </session-factory>

</hibernate-configuration>

 Student.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!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.dong.model.Student" table="student">
		<id name="id" type="long">
			<generator class="increment"/>
		</id>
		
		<property name="name" type="string"/>
		<property name="age" type="integer"/>
		
		<set name="courses" cascade="all" inverse="true">
			<key column="stu_id"/>
			<one-to-many class="com.dong.model.Course"/>
		</set>
	</class>
</hibernate-mapping>

 Course.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!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.dong.model.Course" table="course">

		<id name="id" type="long">
			<generator class="increment" />
		</id>

		<property name="name" type="string"/>
		
		<many-to-one name="student" column="stu_id"/>
	</class>
</hibernate-mapping>

 测试类,我采用了多线程的方式进行了测试,更加深一步的证明了hibernate中存在一个虚拟的数据库系统。

package com.dong.test;

import java.util.HashSet;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.dong.model.Course;
import com.dong.model.Student;

public class TestOneToMany
{
	private static SessionFactory factory;

	static
	{
		try
		{
			factory = new Configuration().configure().buildSessionFactory();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	public static void main(String[] args)
	{
		TestOneToMany t = new TestOneToMany();
		t.mulThreadTest(10000);
		t.mulThreadTest(0);
		t.mulThreadTest(0);

	}

	private void mulThreadTest(final long time)
	{
		Thread t1 = new Thread()
		{
			@Override
			public void run()
			{
				Session session = null;
				Transaction tx = null;

				try
				{
					session = factory.openSession();
					tx = session.beginTransaction();

					Student s1 = new Student();
					s1.setName("dong");
					s1.setAge(22);
					s1.setCourses(new HashSet<Course>());

					Course cs1 = new Course();
					cs1.setName("math");
					cs1.setStudent(s1);

					Course cs2 = new Course();
					cs2.setName("english");
					cs2.setStudent(s1);

					s1.getCourses().add(cs1);
					s1.getCourses().add(cs2);
					
					session.save(s1);
					System.out.println(this.getId() + ":" + s1.getId());
					Thread.sleep(time);
					System.out.println(this.getId() + ":" + s1.getId());

					tx.commit();

					System.out.println(this.getId() + ":" + s1.getId());
				}
				catch (Exception e)
				{
					if (tx != null)
					{
						tx.rollback();
					}
				}
				finally
				{
					if (session != null)
					{
						session.close();
					}
				}
			}
		};
		t1.start();
	}
}
 
分享到:
评论

相关推荐

    精通hibernate:对象持久化技术孙卫琴第二版part2

    本章介绍一对多关联关系的映射方法,重点介绍inverse属性和cascade属性的用法。本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-...

    hibernate映射心得 原创

    映射是Hibernate的核心功能,它涉及到如何将Java类和数据库表之间建立对应关系,包括实体类、属性与数据库字段的映射,以及关系映射(如一对一、一对多、多对多等)。这里的“心得”意味着作者可能分享了一些实践中...

    夏昕-Hibernate+开发指南.pdf

    - **数据关联**:Hibernate支持多种类型的数据关联,例如一对一、一对多、多对多关系,并提供了多种策略来处理这些关联。 - **数据访问**:介绍了POJO(Plain Old Java Object)和VO(Value Object)的概念及其在...

    J2EE系统之-hibernate学习总结

    - **问题背景**:在进行一对多查询时遇到的1+N问题,即一次查询引发多次额外查询,导致性能下降。 - **加载策略分类**: - **类级别加载策略**:在`&lt;class&gt;`标签中定义,控制整个类的加载方式。 - **关联级别加载...

    hibernate继承映射.rar

    《Hibernate继承映射详解》 Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作。...记得实践是最好的老师,多动手,多思考,相信你很快就能熟练掌握Hibernate的继承映射。

    hibernate中文文档

    10. **关联映射**:Hibernate支持多种关联类型,如一对一(OneToOne)、一对多(OneToMany)、多对一(ManyToOne)和多对多(ManyToMany)。关联可以通过注解或XML配置文件定义。 11. **延迟加载(Lazy Loading)**...

    精通Hibernate:对象持久化技术第二版part3

    本章介绍一对多关联关系的映射方法,重点介绍inverse属性和cascade属性的用法。本章还将介绍通过Hibernate API来保存、修改和删除具有关联关系的对象的方法。 7.1 建立多对一的单向关联关系 148 7.1.1 [many-to-...

    基于struts2、spring、hibernate构建一个网上投票系统-毕业论文.doc

    结合Struts2、Spring、Hibernate构建的网上投票系统,实现了高效的数据访问、灵活的业务控制和良好的代码组织。它提供了稳定的服务,能够应对大量用户并发访问,且易于扩展和维护。 3.2 体会 通过这个项目,开发者...

    第24次课-1 Spring与Hibernate的整合

    Hibernate的SessionFactory,是单个数据库映射关系编译后的内存镜像,是Hibernate执行持久化访问的基础。 Spring通过ApplicationContext管理SessionFactory,可以不使用Hibernate应用必需的hibernate.cfg.xml。 ...

    spring+hibernate+struts集成开发实例

    《Spring、Hibernate、Struts集成开发实例详解》 在当今的Web开发领域,Spring、Hibernate和Struts被誉为经典的“SSH”...在学习过程中,遇到问题不要气馁,多查阅资料,多思考,相信你一定能在SSH的世界里游刃有余。

    java论坛管理系统设计(源代码+论文)

    这个系统的设计涵盖了软件工程的多个关键领域,包括需求分析、系统设计、编码实现、测试与维护等。以下将详细阐述该系统的相关知识点。 首先,Java语言是系统开发的基础。Java以其跨平台性、面向对象特性和丰富的...

    代码生成器Mgicode生成器JAVA代码生成器

    另外设计的dao,service接口及实现很多都用不着,用得着的根本就没有设计。因为需要的dao,service很多都是由页面根据取数操作的不同而进行不同的编写。 开发过程的修改,就会带来原前置流程步骤的修改,所以软件开发...

    struts2+spring+hibernate整合策略

    - **定义**:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。 - **应用场景**:事件监听、数据绑定等。 #### 三、软件架构设计原则 1. **贫血...

    java设计及源代码

    此外,Java还提供了丰富的库和框架,如Spring框架用于简化企业级应用开发,Hibernate作为对象关系映射(ORM)工具简化了数据库操作,JUnit则用于编写和运行单元测试,确保代码的正确性。 在张永常老师的课程中,你...

    基于java的CRM客户关系管理系统(项目报告+答辩PPT+源代码+讲解视频).zip

    6. **基于Java的CRM客户关系管理系统的设计和实现项目源代码**: 源代码是整个项目的灵魂,包含了所有业务逻辑和系统功能的实现。通过阅读和分析源代码,学习者可以深入理解Java编程技巧、面向对象设计原则、MVC...

Global site tag (gtag.js) - Google Analytics