`
wlzjdm
  • 浏览: 26544 次
  • 性别: 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作为一个持久层框架,它的诞生解决了传统编程模式中业务逻辑与数据库访问代码混杂的问题,这不仅导致程序结构混乱,降低代码的可读性和维护性,还使得开发者在处理业务逻辑时无法全身心投入面向对象的思考...

    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