`
OracleX
  • 浏览: 120990 次
  • 性别: Icon_minigender_1
  • 来自: 地球
社区版块
存档分类
最新评论

Hibernate学习之一对多关联

阅读更多

注意事项:

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学习之 : 一对多关联映射

    博文链接:https://ag-bruce.iteye.com/blog/213436

    hibernate学习5之one-to-many双向关联.docx

    如果在”一“一端维护一对多关联关系,hibernate会发出多余的udpate语句,所以我们一般在多的一端来维护关联关系。 加上inverse="true"这个属性,就可以强制在多的一端维护关系了。

    hibernate 的一个简单关联应用

    hibernate 的一个简单关联应用学习,简单叙述了hibernate中表格关联处理的代码,仅供初学的参考练习之用

    夏昕.深入浅出Hibernate

    本书内容深入浅出,先讲述持久层设计与ORM,再由Hibernate概述、Hibernate基础Hibernate高级特性顺序展开,直至Hibernate实战,重点讲述了 Hibernate的基础语法、基础配置、O/R映射、数据关联、数据检索、HQL实用...

    低清版 大型门户网站是这样炼成的.pdf

    4.3.4 映射一对一关联关系 228 4.3.5 映射多对一单向关联关系 235 4.3.6 映射一对多双向关联关系 239 4.3.7 映射一对多双向自身关联关系 244 4.3.8 映射多对多单向关联关系 247 4.3.9 映射多对多双向关联关系 ...

    基于struts+hibernate+spring+easyui+mysql的网上商城项目实战源码.zip

    自1998年首次发布以来,MySQL以其卓越的性能、可靠性和可扩展性,成为全球范围内Web应用程序、企业级解决方案以及其他各种数据处理场景的首选数据库平台之一。 以下是对MySQL数据库的详细介绍: 核心特性与优势 ...

    史上最全的和java相关的api文档并且基本都是chm格式的有十二个部分这是12部分

    里面全部是和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完全...

    java文集

    DFS文件读写 网络爬虫之Spider Java正则表达式的总结关键词: Java正则表达式 批量上传--采集 (多个文件夹) The Agile Way hibernate mapping文件中的标记详解:关系标记 ANT 安装使用及...

    【计算机软件毕业设计】二手车交易平台的分析、设计与实现文献综述1.doc

    [2] 缑艳阳在计算机与网络发表说WebWork是比较领先的MVC框架之一,是OpenSymphony组织 的一个开放源码项目,致力于组件化和代码重用。[1] 1.2 Struts框架 2002年,国外C. Cavaness 专家认为Struts是一个典型的MVC...

    JAVA自学之路

    另一个人直接工作,忙,天天在机器旁日复一日,做了一辈子,没时间学习和进修,可以想象,产量能有多大呢。 人的一生,要锻炼产能,也要及时产出,引擎要转,也要停下来加油,这两者平衡的越好,你的贡献和产量就...

    iBATIS实战

    书的最后给出了一个设计优雅、层次清晰的示例程序JGameStore,该示例涵盖全书的大部分知识点,可以作为iBATIS学习和Web开发的经典案例,非常值得深入研究。 本书既可为广大的开发人员(不仅仅是Web应用程序开发人员)...

Global site tag (gtag.js) - Google Analytics