- 浏览: 120990 次
- 性别:
- 来自: 地球
文章分类
最新评论
-
754731046:
很适合对初学者适用,谢谢
Oracle存储过程详解 -
天明破晓:
我测试了,不好用
Java中的正则表达式验证各种电话号码 -
OracleX:
otom31 写道从来不用标签库,几乎不用struts,除了最 ...
标签库的优点、缺点大辩论 -
otom31:
从来不用标签库,几乎不用struts,除了最早公司要使用以外; ...
标签库的优点、缺点大辩论
注意事项:
1.单向一对多
只需在“一”放进行配置
2.双向一对多
需要在关联双方都加以配置,而且需要在一的一方设置inverse=true
首先是实体类:
TAddress.java(多的一方)
public class TAddress implements Serializable { private static final long serialVersionUID = 1121137857691229229L; private Integer id; private String address; private String zipcode; private String tel; private String type; private TUser user; //必须有 ............ }
TUser.java(一的一方)
public class TUser implements Serializable { private static final long serialVersionUID = 1224691192698621789L; private Integer id; private Integer age; private String name; @SuppressWarnings("rawtypes") private Set address = new HashSet(); //多的一方放在集合中
.................... }
然后是各个实体类的配置文件
TAddress.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" > <!-- 一对多 --> <hibernate-mapping> <class name="com.model.TAddress" table="t_address" dynamic-update="false" dynamic-insert="false"> <id name="id" type="java.lang.Integer" column="id" unsaved-value="0"> <generator class="native" /> </id> <property name="address" column="address" type="string" /> <property name="tel" column="tel" type="string" /> <property name="zipcode" column="zipcode" type="string" /> <property name="type" column="type" type="string" /> <!-- 必须有many-to-one 否则关联字段(user_id)为null --> <many-to-one name="user" class="com.model.TUser" cascade="none" outer-join="auto" update="true" insert="true" access="property" column="user_id" not-null="true"> </many-to-one> </class> </hibernate-mapping>
TUser.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" > <!-- 一对多 外键关联 --> <!-- Select from TUser where id=1 Select from TUser where id=1 to Select from TUser where id=1 or id=2 --> <!-- batch-size 批量加载机制 可以自定义每次批量加载的数量 --> <hibernate-mapping> <class name="com.model.TUser" table="t_user" dynamic-update="true" > <id name="id" type="java.lang.Integer" column="id" unsaved-value="0"> <generator class="native" /> </id> <property name="name" column="name" /> <property name="age" column="age" /> <set name="address" table="t_address" cascade="all" order-by="zipcode asc" lazy="true" inverse="true"> <key column="user_id" /><!-- 确定关联的外键列 --> <one-to-many class="com.model.TAddress" /> </set> </class> </hibernate-mapping>
其次是hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 2.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd"> <hibernate-configuration> <session-factory> <!-- properties --> <!-- 数据库URL --> <property name="hibernate.connection.url">jdbc:mysql://localhost/onetomany</property> <!-- 数据库JDBC驱动 --> <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property> <!-- 数据库用户名 --> <property name="hibernate.connection.username">root</property> <!-- 数据库密码 --> <property name="hibernate.connection.password">hello</property> <!-- 数据库方言 --> <property name="dialect">net.sf.hibernate.dialect.MySQLDialect</property> <!-- 是否日志调试 --> <property name="show_sql">true</property> <!-- 是否使用数据库外连接 --> <property name="use_outer_join">true</property> <!-- 事务管理 使用JDBC Transaction(使用JTA会报错) --> <property name="transaction.factory_class"> net.sf.hibernate.transaction.JDBCTransactionFactory </property> <!-- 指定hibernate每次提交的SQL数量 对批量操作的性能提升帮助很大!!!!!!!!!!!!! --> <property name="hibernate.jdbc.batch_size">25</property> <!-- 映射文件配置,配置文件名必须包含其相对于根的全路径 --> <mapping resource="com/model/TUser.hbm.xml" /> <mapping resource="com/model/TAddress.hbm.xml" /> </session-factory> </hibernate-configuration>
测试代码(部分)
增加
public void testSave(){ try { Transaction tx=session.beginTransaction(); // TUser user=(TUser) session.load(TUser.class, 1); TUser user=new TUser(); user.setName("zhangsan"); user.setAge(20); TAddress address=new TAddress(); address.setAddress("jingsan"); address.setTel("1361380"); address.setZipcode("45000"); address.setType("java"); address.setUser(user); //设置关联的TUser对象 user.getAddress().add(address); session.save(user); //级联更新 tx.commit(); } catch (HibernateException e) { e.printStackTrace(); } }
查询
public void testLoad(){ try { Transaction tx=session.beginTransaction(); String hql="from TUser where name='zhangsan'"; List list=session.createQuery(hql).list(); System.out.println("-------------1------------"); Iterator iter=list.iterator(); while(iter.hasNext()){ TUser user=(TUser) iter.next(); System.out.println("--------------2------------"); System.out.println("user.name="+user.getName()); System.out.println("--------------3------------"); System.out.println("user.address="+user.getAddress().size()); System.out.println("--------------4------------"); } } catch (HibernateException e) { e.printStackTrace(); } }
批量插入(可以提高性能)
实现机制:如果使用了批量加载机制,hibernate在进行数据查询操作前,会自动在当前session中寻找是否还存在
其他同类型待加载的数据,如果有,则将其查询条件合并在当前的select语句中一并提交,这样,通过
一次数据库操作即完成了多个读取任务。
//批量插入操作性能优化 通过配置<property name="hibernate.jdbc.batch_size">25</property> public void testBatchInsert(){ long start=System.currentTimeMillis(); this.importUserList(); long end=System.currentTimeMillis(); System.out.println("批量插入花费时间是"+(end-start)); } public void importUserList(){ try { Transaction tx=session.beginTransaction(); for(int i=0;i<10000;i++){ TUser user=new TUser(); user.setName("user"+i); session.save(user); if(i%25==0){ //以每25个数据作为一个处理单元 session.flush(); session.clear(); } } tx.commit(); } catch (HibernateException e) { e.printStackTrace(); } }
发表评论
-
Hibernate学习之hibernate.cfg.xml配置
2011-08-23 09:22 717<?xml version='1.0' encodi ... -
Hibernate学习之初步使用
2011-08-23 10:47 810package com.test; import j ... -
Hibernate学习之三种状态及生命周期(图)
2011-08-23 11:36 769三种状态: 生命周期: 代码表示: / ... -
Hibernate学习之一对一关联
2011-08-23 13:35 733一对一关联包括两种类型:1.主键关联2.惟一外键关联 主键关 ... -
Struts1入门实例(简单登录)
2011-09-19 23:00 882现在开始加入公司的核心项目,但由于项目开发比较早,所以使用的技 ... -
Hibernate学习包
2011-08-23 11:23 696Hibernate基础、一对一、一对多关联,及相应的工具包或j ... -
HIBERNATE关联关系映射
2011-04-25 21:29 6931、单向N-1 2、单向1-1 3、单向1-N 4、 ... -
Hibernate配置详解【转】
2011-04-25 21:22 613表 3.3. Hibernate配置属性 ... -
hibernate.cfg.xml配置总结【转】
2011-04-25 21:19 837Hibernate的描述文件可以是一个properties ... -
Hibernate hbm.xml配置【转】
2011-04-25 21:04 708配置文件的基本结构如下: <?xml vers ... -
Spring与Hibernate集成中的session
2011-04-24 14:42 01.通过getSession()方法获得session操作 ... -
Hibernate主键生成策略【转】
2011-04-24 14:08 724Hibernate主键产生器 可 ... -
Hibernate HQL查询 插入 更新(update)实例 【转】
2011-04-24 14:08 8071、 实体查询: 有关实 ...
相关推荐
博文链接:https://ag-bruce.iteye.com/blog/213436
如果在”一“一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多的一端来维护关联关系。 加上inverse="true"这个属性,就可以强制在多的一端维护关系了。
hibernate 的一个简单关联应用学习,简单叙述了hibernate中表格关联处理的代码,仅供初学的参考练习之用
本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了 Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用...
4.3.4 映射一对一关联关系 228 4.3.5 映射多对一单向关联关系 235 4.3.6 映射一对多双向关联关系 239 4.3.7 映射一对多双向自身关联关系 244 4.3.8 映射多对多单向关联关系 247 4.3.9 映射多对多双向关联关系 ...
自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...
里面全部是和java学习相关的api 里面有29个文件包括css详细教程.chm、DHTML 中文手册.chm、dojo API.air、Hibernate3.5.1-Final-API.chm、Hibernate-3.5.2-Final-API.chm、html.chm、HTML入门与提高.CHM、HTML完全...
DFS文件读写 网络爬虫之Spider Java正则表达式的总结关键词: Java正则表达式 批量上传--采集 (多个文件夹) The Agile Way hibernate mapping文件中的标记详解:关系标记 ANT 安装使用及...
[2] 缑艳阳在计算机与网络发表说WebWork是比较领先的MVC框架之一,是OpenSymphony组织 的一个开放源码项目,致力于组件化和代码重用。[1] 1.2 Struts框架 2002年,国外C. Cavaness 专家认为Struts是一个典型的MVC...
另一个人直接工作,忙,天天在机器旁日复一日,做了一辈子,没时间学习和进修,可以想象,产量能有多大呢。 人的一生,要锻炼产能,也要及时产出,引擎要转,也要停下来加油,这两者平衡的越好,你的贡献和产量就...
书的最后给出了一个设计优雅、层次清晰的示例程序JGameStore,该示例涵盖全书的大部分知识点,可以作为iBATIS学习和Web开发的经典案例,非常值得深入研究。 本书既可为广大的开发人员(不仅仅是Web应用程序开发人员)...