- 浏览: 200037 次
- 性别:
- 来自: 成都
文章分类
最新评论
-
liouyan9:
jiangshiwei2008 写道老是提醒Servlet s ...
spring-mvc入门(一):入门实例 -
hochoy:
...
spring-mvc入门(二):后端控制器(上) -
springmvc_springjpa:
spring mvc demo教程源代码下载,地址:http: ...
spring-mvc入门(一):入门实例 -
yahier:
想问,不在代码中去try catch的话 log4j怎么记录项 ...
SSH集成log4j日志环境 -
13_木木:
谢谢分享,明白了很多
spring-mvc入门(一):入门实例
七 关联关系讨论
1.多对一关系映射:
一个部门有可以有多个员工,而一个员工只属于一个部门。从员工角度看,很多员工会隶属一个部门。 现以实例说明,实例概要:一个部门类,只有id和部门名称两个属性。有一个员工类,有id和员工名称及部门对象三个属性。操作步骤如下:
>>步骤一,建立Depatment.java及实体配置文件:
package com.asm.hibernate.domain; public class Department { 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; } }
同包下的实体配置文件:Depart.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.asm.hibernate.domain"> <class name="Department"> <id name="id"> <generator class="native" /> </id> <property name="name"></property> </class> </hibernate-mapping>
以上的操作,没的什么可多言的,和前面的配置是一样的形式。
>>步骤二,Employee.java内容如下及实体配置文件
package com.asm.hibernate.domain; public class Employee { private int id; private String name; private Department depart; 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; } public Department getDepart() { return depart; } public void setDepart(Department depart) { this.depart = depart; } }
同包下的实体配置文件:Employee.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.asm.hibernate.domain"> <class name="Employee"> <id name="id"> <generator class="native" /> </id> <property name="name"></property> <many-to-one name="depart" column="depart_id" /> </class> </hibernate-mapping>
先来说这个类文件,它的一个重要属性就是Department对象,这就是它所关联的一个外键,这里我们只必须记住一点,每个实体类对应于一张表,如果一张表想关联另一张表,则只需要在这张表所对应的实体类中引入它想关联表的实体类对象。再进行简单的配置即可。再来看配置文件,这里主要看这个<many-to-one name="depart" column="depart_id"></many-to-one>元素,它的name属性仍然是实体类中的属性。column为对应表的外键。可以留意下数据库表中的相关表。
>>修改主配置文件,增加以下内容以便找到相应的实体配置文件。
<mapping resource="com/dep/emp/Employee.hbm.xml"/>
<mapping resource="com/dep/emp/Depart.hbm.xml"/>
>>步骤四,编写测试类。类中省略导入包的内容。
package com.asm.hibernate.test; public class ManyToOneTest { public static void main(String[] args) { add(); } static void add() { Session s = null; Transaction tx = null; try { Department depart = new Department(); depart.setName("departName"); Employee emp = new Employee(); emp.setName("empName"); emp.setDepart(depart); s = HibernateUtil.getSession(); tx = s.beginTransaction(); s.save(depart); s.save(emp); // 交换以上两句的位置,看Hibernate执行的sql语句。会再增加一条更新操作。 tx.commit(); } finally { if (s != null) s.close(); } } }
说明:以前插入新的记录,都要传递一个实体对象,而这里没有这么做,原因是为了体现出一个插入记录的顺序问题,仔细观察add()方法,发现先保存的是Department对象,再保存的是Employee对象,原因是什么?这里略作说明,我们知道此项目设计的是让Employee表来关联Department表,而要想关联此表,必须保证此表已进行存储,这里暂时这样理解,也可以试试颠倒save方法的顺序,或是不保存depart来看看效果,这样也许有助理解。
简要说明,以上提到的尝试性操作:颠倒顺序,可以通过,只是增加了一条更新操作;不保存dep则不能通过,原因是此实体对象没有保存;再测试,如果注释掉“depart.setDname("deptName");”后面按正常顺序执行,发现是能正确执行的。只是在数据库的employee表中depart_id字段为null,如果我们在前面设置<many-to-one name="depart" column="depart_id">中增加:not-null="true"这个属性,再来执行将会报“不能为空的错误”。通过增加这个属性,可以让我们更好理解如何建立两个对象的关联。
>>步骤五,再探查询方法。接上面,在测试类中增加一个查询方法,内容如下:
static Employee query(int empId) { Session s = null; try { s = HibernateUtil.getSession(); Employee emp = (Employee) s.get(Employee.class, empId); System.out.println("Department Name:" + emp.getDepart().getName()); return emp; } finally { if (s != null) s.close(); } }
随后再在主方法中增加如下内容:便可以测试结果:
query(1);
对结果的说明分析:如果在以往的JDBC操作中,我们想得到这个部门的信息,需要查两次才能得到,这里的 Hibernate就实现了这一优化,如果我们开启了控制台的数据库显示功能(主配置文件中开启,前面已提到),便可以查看下数据库的执行操作,并切实感受到这里实际执行了两步查询操作,在以后的操作中,建议开启此属性,以便切实体会数据库操作。
>>步骤六,增加一个新的查询方法query2,内容如下,注意和query区别:
static Employee query2(int empId) { Session s = null; try { s = HibernateUtil.getSession(); Employee emp = (Employee) s.get(Employee.class, empId); Hibernate.initialize(emp.getDepart()); //上一句作用后面会作说明,这里略作了解 return emp; } finally { if (s != null) s.close(); } }
在main方法中增加如下内容进行测试:
Employee emp = query2(1);
System.out.println(emp.getDepart().getName());
评论
第一个问题,我在第一节已经粗粗地提到过,<hibernate-mapping package="hibernate.entities"> package相当于一个包,它下面可以有很多class.
第二个问题,在后面章节会对级联有一个较详细的讲解。
自己研究出这两点,不错。
package hibernate.test; import hibernate.entities.Department; import hibernate.entities.Employee; import hibernate.util.HibernateUtil; import org.hibernate.Hibernate; import org.hibernate.Session; import org.hibernate.Transaction; public class ManyToOneTest { static void add() { Department depart = new Department(); depart.setName("工程部"); Employee emp = new Employee(); emp.setName("jack"); emp.setDepart(depart); Session s = HibernateUtil.getSession(); Transaction ts = s.beginTransaction(); try { s.save(emp); ts.commit(); } finally { if (s != null) { s.close(); } } } static Employee query(int empId) { Session s = HibernateUtil.getSession(); try { //Employee emp = (Employee) s.get(Employee.class, empId);// 推断这里emp对象还将session 一并接受了 //System.out.println(emp.getDepart().getName()); //return emp; return (Employee) s.get(Employee.class, empId); } finally { if (s != null) { s.close(); } } } static Employee query2(int empId) { Session s = HibernateUtil.getSession(); try { Employee emp = (Employee) s.get(Employee.class, empId); Hibernate.initialize(emp.getDepart()); return emp; } finally { if (s != null) { s.close(); } } } public static void main(String[] args) { add(); System.out.println("添加的员工姓名为:" + query(1).getName()); //System.out.println("添加的员工部门为:" + query(1).getDepart());// 如果直接返回Employee的话, 报错 session 对象缺失 System.out.println("H添加的员工部门为:" + query2(1).getDepart().getName()); } }
1,减少更新hibernat.cfg.xml主配置文件以及entity配置文件的方法:
将所有的entity类配置都写在一个配置文件里面,集体作为一个文件载入主配置文件即可
如下:
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory name="foo"> <property name="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property> <property name="hibernate.proxool.pool_alias">proxool</property> <property name="hibernate.proxool.xml">proxool.xml</property> <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> <property name="hibernate.show_sql">true</property> <property name="hibernate.hbm2ddl.auto">create</property> <!-- <property name="hibernate.hbm2ddl.auto">update</property>--> <mapping resource="hibernate/entities/entities.hbm.xml" /> </session-factory> </hibernate-configuration>
entities.hbm.xml文件如下:
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="hibernate.entities"> <class name="User" table="oauser"> <id name="usID"> <generator class="native" /> </id> <property name="usName"></property> <property name="usPwd"></property> <property name="usRole"></property> </class> <class name="Department" > <id name="id"><generator class="native" /></id> <property name="name"></property> </class> <class name="Employee" > <id name="id"><generator class="native" /></id> <property name="name"></property> <!--此处配置的depart_id没任何其他意义,仅为一个表里起的一个字段名而已!--> <many-to-one name="depart" column="depart_id" cascade="save-update"></many-to-one> </class> </hibernate-mapping>
2,减少调用save方法,及出错概率^^
直接在配置中增加“cascade="save-update"”,关联保存,保存Employee对象的时候,自动保存Department对象。
以上是我研修到你这里时候的一些发现^^我比较懒惰的^^
发表评论
-
原创hibernate入门笔记[共计46页]
2010-05-05 16:04 4315第三次分享自己的原创笔记,希望大家多多指正, 我 ... -
hiberante入门(十七):简要总结及源码文档
2009-10-17 17:04 1286十三、总结: 1.主配置与实体(映射)配置: 关于这些配置 ... -
hiberante入门(十六):一些细节理论
2009-10-17 17:03 1543十二、一些细节问题分析 1.实体配置文件中的类型问题: 在 ... -
hiberante入门(十五):事务相关-悲观乐观锁
2009-10-17 17:02 18851.事务引发的三层架构MVC讨论:在前面的程序代码中多次用到了 ... -
hiberante入门(十四):缓存
2009-10-17 17:01 19331.模拟缓存并简要说明缓存实现原理 在myhibernate ... -
hiberante入门(十三):懒加载
2009-10-17 17:01 14454.懒加载: 在前面我们已经对懒加载有所提及,现在再借助一个 ... -
hiberante入门(十二):继承关系
2009-10-17 17:00 14643.继承关系: 在前面的部门员工实例中,我们设定的员工只是普 ... -
hibernate入门(十一):级联操作inversin属性
2009-10-17 16:59 1263九、关联关系中的高级 ... -
hiberante入门(十):其它集合类型
2009-10-17 16:58 1243八、其它集合类型 说明:在前面我们已经使用过set集合类型, ... -
hibernate入门(九):组件关系映射
2009-10-06 13:02 12095.组件关系映射: 典型实例:每个人有不同的名字,或者多个人 ... -
hibernate入门(八):多对多
2009-10-03 12:38 14724.多对多关系映射: 典型实例:一个学生可以有多个老师, ... -
hibernate入门(七):一对一
2009-10-03 12:33 15663.一对一关系映射: 典型的实例:一个人有一个身份 ... -
hibernate入门(六):一对多
2009-10-03 05:21 12512.一对多关系映射: 上面提到的多个员工对应于一个部门,是多 ... -
hibernate入门(四):HQL QBC初步
2009-10-03 05:08 2121五 完善工具类及HQL QBC初步相关1.无聊的讨论: 在前 ... -
hibernate入门(三):对象的三种状态
2009-10-03 05:06 1798三 Session中的主要方法 ... -
hibernate入门(二):优化代码
2009-10-03 04:58 1378二 优化代码 1.为会么要优化 在前面我们已经知道,获取S ... -
hibernate入门(一)
2009-10-03 04:48 1689一 第一个应用实例 1.搭建环境:新建一个名为Hiberna ...
相关推荐
Hibernate入门到精通,分享Hibernate的干货,带你入门,走向精通。
Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门笔记Hibernate入门...
解压后包含hibernate入门所需jar (hibernate常用jar,mysql驱动,Junit4jar)
hibernate 入门:10分钟跑起这个hibernate 示例程序 (图解、附源码http://download.csdn.net/source/650851)
Hibernate入门案例,提供MyEclipse和Eclipse的项目源文件以及war文件
NULL 博文链接:https://dr-yanglong.iteye.com/blog/1935853
hibernate入门
hibernate 入门详细操作步骤 包括hibernate包,实例实现文档····
总共分5部分:1和2为hibernate入门,3为hibernate实体映射,4为hibernate复合主键,5为hibernate实体层设计.
hibernate入门小例子,采用mysql(sql-front)数据库
Hibernate入门教程.pdf
hibernate 映射关系学习入门 多对多实体映射 源码
Hibernate新手入门,详细讲解hibernate框架技术,以及这门技术所包含的orm思想等。
第一章:Hibernate入门 包括:是什么、ORMapping原理、能干什么、有什么、怎么做(做什么) 第二章:Hibernate的HelloWorld 第三章:Hibernate的配置 包括:cfg配置、mapping配置、组件映射、事务配置、缓存配置 ...
hibernate 入门经典实例 hibernate 入门经典实例 hibernate 入门经典实例 hibernate 入门经典实例 hibernate 入门经典实例
hibernate hibernate入门 hibernate学习 hibernate基础
这是一个关于hibernate入门到精通的书,希望可以帮到你
案例目录: 01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了Hibernate进行持久化的一些过程,因为是Hibernate的入门实例,所以注释很详细,其中有... 一对一、多对一、一对多、多对多等几种情况。