`

Hibernate配置Set和List

阅读更多
========================Set==============================

这个方法和之前map说的基本一样。
http://alleni123.iteye.com/admin/blogs/1979726
不需要配置Student.hbm.xml, 只要创建一个没有属性的Student.java


Team.java
public class Team
{
	private String id;
	
	private String name;
	
	private Set students=new HashSet();
}


Team.hbm.xml

<hibernate-mapping package="set">
	<class name="Team" table="test_team">

		<id name="id" column="id" type="string">
			<generator class="uuid">
			</generator>
		</id>

		 <property name="name" column="team_name" type="string"/>
		 
		 <!-- 映射set里面所存放的对象的表 -->
		 <set name="students" table="test_student">
		 
		 <key column="team_id"></key>
		 
		 <!-- set没有key的概念,因此这里不需要index,只需要element -->
		 <element column="student_name" type="string"/>
		 </set>
		  
		 
	</class>



</hibernate-mapping>



运行Configure,Hibernate会生成如下SQL语句:

create table test_student (
team_id varchar2(255 char) not null,
student_name varchar2(255 char));


create table test_team(
id varchar2(255 char) not null,
team_name varchar2(255 char),
primary key(id));

alter table test_student add constraint FK_dk062403lt7507oncwn9uo4ro foreign key (team_id) references test_team;



也就是说,table test_student的生成信息完全依赖于Team.hbm.xml中的<set>元素的内容。


 <set name="students" table="test_student">
		 <key column="team_id"></key>
		 <element column="student_name" type="string"/>
		 </set>


set name对应的是Team.java中的getter和setter的属性名称。
table="test_student"是数据库中的表名
element定义Set集合的元素。 column是数据库中该表的列名,这里是student_name,数据类型是String
key定义外联到Team表的外键, 这里是team_id。



==============================================================================
插入

	Session session=HibernateUtil.openSession();
		
  		Transaction tx=session.beginTransaction();
 	 
 		Team team=new Team();
 		
 		team.setName("english");
 		
		Set set=team.getStudents();
		
		set.add("alleni");
		set.add("eline");
		
		
		session.save(team);
		
		tx.commit();


这里只要获取这个Set对象, 然后对其进行操作, 最后执行sessin.save(team),就成功把数据插入数据库了。


查询
这里主要讲一下查询的排序
Hibernate的排序分为两种,一种是内存查询排序,一种是数据库查询排序。
内存排序是指获取数据库的数据之后,再在内存中通过Java来排序。
数据库排序是通过SQL语句,比如order by,直接在数据库中排好,再提取出来。

数据库查询排序
设置数据库排序的地方在Team.hbm.xml里:
	 <!-- 映射set里面所存放的对象的表 -->
		 <set name="students" table="test_student" order-by="student_name asc">
		 
		 <key column="team_id"></key>
		 
		 <!-- set没有key的概念,因此这里不需要index,只需要element -->
		 <element column="student_name" type="string"/>
		 </set>


这里一定要注意一点,就是order-by="student_name asc",这里的名称一定要
和映射文件配置的column名称一致。否则会报如下错误:

ERROR: ORA-00904: "STUDENTS0_"."NAME": 标识符无效

Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not extract ResultSet


这里就是因为我把order-by设置成了name asc,
结果Hibernate就会查询student.name, 而Student表中并无此列。

--
如果我们的数据库里有三个student,名字分别是alleni,eline,333,
就会被SQL语句排序成333,alleni,eline,
如下所示:
Hibernate: select students0_.team_id as team1_1_0_, students0_.student_name as student2_0_0_ from test_student students0_ where students0_.team_id=? order by students0_.student_name asc

345
alleni
eline


也就是会在最后加入order by student.student_name asc

以上便是数据库查询排序。


内存排序
内存排序的配置和上面差不多,就是把order-by去掉,改成
sort="natural"
这样不会生成order by的SQL语句,但是Hibernate会通过Java的程序给返回结果排序,默认是升序,和上面的order-by=student_name asc一样。



总结:

map与set标签中的element子标签映射的是原生类型(string,date,int,long..), 既能够直接映射到数据库表字段上的类型, 而one-to-many映射的则是实体类型,指的是无法映射到表的某个字段,而是要映射到整张表的类型。

element和one-to-many是互斥的, 在set以及map标签中,当使用了其中一个,就不能再用另一个。



========================List==============================

List和Set基本差不多。 但是List和Set本质上是有不同的,那就是List是有序的,而Set是乱序的。
当加入元素到List中,是根据加入的顺序排序的。
而Set这个东西,不管你是先进还是后进,它都是给你弄成乱序的。


在Hibernate中,我们要配置List,就必须配置一个标识序列的列,该列用数字表示,0-X。

看看具体配置:
修改后的Team.hbm.xml
	 <list name="students" table="test_student" cascade="all">
		 	<key column="team_id"/>
		 	
		 	<!-- list是有顺序的 -->
		 	<!-- index用于标示多的一方 -->
		 	<index column="index_"></index>
			<one-to-many class="Student"/>
		 	
		 </list>

index_这里会在数据库中生成的Student表中。
具体看看运行就知道了。


Session session=HibernateUtil.openSession();
		
  		Transaction tx=session.beginTransaction();
 	 
 		Team team=new Team();
 		
 		team.setName("english");
 		
		List list=team.getStudents();
		
		
		Student s1=new Student(null,"111","alleni",23,team);
		
		
		Student s2=new Student(null,"222","eline",23,team);
		
		list.add(s1);
		list.add(s2);
		
		
		Team team2=new Team();
		team2.setName("math");
		
		Student s3=new Student(null,"333","mike",23,team2);
		List list2=team2.getStudents();
		list2.addAll(Arrays.asList(s3));
		
		
		
		
		session.save(team);
		session.save(team2);
		
		tx.commit();


最后生成的结果是:




Hibernate会根据list里面的元素的顺序,给所有元素加入index值,插入数据库中。
  • 大小: 89.7 KB
分享到:
评论

相关推荐

    hibernate 一对多 set 与 list 分别用法

    本篇文章将深入探讨`Hibernate`中一对多关系使用`Set`和`List`的区别以及它们的实现方式。 首先,我们要理解`Set`和`List`在Java集合框架中的本质区别。`Set`不包含重复元素,且内部元素有序,但插入顺序不保证;而...

    Hibernate中List信息的配置

    在探讨Hibernate中List信息的配置时,我们主要聚焦于如何在ORM(对象关系映射)框架下有效地管理和操作集合类型,尤其是List、Set以及Map。本文将深入解析List与Set在Hibernate中的映射机制,同时也会简要提及Map的...

    Hibernate常见集合映射(Set,List_Array,Map,Bag)

    常见的集合映射类型有 Set、List、Array、Map 和 Bag 等,每种类型都有其特点和应用场景。 Set 集合映射 Set 集合是 Hibernate 中基础的集合类型,元素数据一般使用外键同主表关联。Set 集合非常适用于集合元素不...

    hibernate set 集合映射

    本文将深入探讨`hibernate set 集合映射`这一主题,结合标签“源码”和“工具”,我们将讨论其基本概念、配置、以及在实际开发中的应用。 ### Hibernate集合映射基础 1. **集合类型**:Hibernate支持多种集合类型...

    hibernate 中的 set map list 代码

    本主题主要聚焦于如何利用Hibernate处理集合类型的属性,包括Set、List和Map。这些集合类型的映射允许我们在一个实体类中存储多个相关联的数据项,从而实现一对多或多对多的关系。 首先,Set是不包含重复元素的集合...

    Hibernate映射集合属性List

    如果不使用注解,我们可以在`hibernate.cfg.xml`中配置实体类和数据库表的关系,然后在实体类的`.hbm.xml`文件中定义集合属性的映射。例如,`User.hbm.xml`可能包含以下内容: ```xml &lt;!-- 其他属性映射 --&gt; ...

    LIST对象排序通用方法HIBERNATE的SET排序.pdf

    LIST对象排序通用方法HIBERNATE的SET排序.pdf

    分析LIST对象排序通用方法HIBERNATE的SET排序.pdf

    分析LIST对象排序通用方法HIBERNATE的SET排序.pdf

    Hibernate容器映射技术(Set、List、Map)

    Hibernate容器映射技术(Set、List、Map)

    LIST对象排序通用方法HIBERNATE的SET排序[整理].pdf

    LIST对象排序通用方法HIBERNATE的SET排序[整理].pdf

    Hibernate的配置详解

    这个接口用于设置Hibernate所需的配置信息,如数据源、连接参数等,并根据配置文件读取信息创建`SessionFactory`。`SessionFactory`是一个重量级对象,它是整个应用中唯一需要实例化的对象,用于创建`Session`对象。...

    Hibernate分页显示和添加

    Hibernate通过XML配置文件或注解来定义对象与数据库表之间的映射关系。这些映射使得开发者可以用Java对象的方式来操作数据库,减少了对SQL的直接依赖。 对于分页显示,我们通常需要使用`Criteria`、`Query`接口或者...

    springboot+jpa(hibernate配置redis为二级缓存) springboot2.1.4

    在本文中,我们将深入探讨如何在Spring Boot 2.1.4.RELEASE项目中结合JPA(Java Persistence API)和Hibernate实现Redis作为二级缓存。首先,我们需要理解这些技术的基本概念。 Spring Boot 是一个用于简化Spring...

    关于hibernate 的createQuery和createSqlQuery 的区别

    Hibernate 中的 createQuery 和 createSqlQuery 区别详解 在 Hibernate 中,createQuery 和 createSqlQuery 是两个常用的查询方法,但是它们之间存在着一些关键的区别。了解这两个方法的差异对于正确地使用 ...

    springboot(4) 整合mybatis和hibernate

    Spring Boot因其简化配置和快速开发的能力而备受青睐,而MyBatis和Hibernate则是Java世界里常用的持久层解决方案。这里我们将看到如何将它们集成到同一个应用中,以充分利用各自的优势。 首先,我们需要在`pom.xml`...

    hibernate集合的映射

    本文将深入探讨Hibernate中的四种主要集合映射类型:Set、List、Array和Map,以及它们在实际开发中的应用场景和配置。 一、Set集合映射 Set集合映射是最常见的映射类型,它不允许重复元素。在Hibernate中,Set通常...

    hibernate3.zip 包含hibernate3.jar

    10. **集合映射**:Hibernate支持多种集合类型(如List、Set、Map等)与数据库表中的多对一、一对多、多对多关系的映射。 11. **事件监听器**:Hibernate允许注册事件监听器,对持久化对象的各种操作(如保存、更新...

    Hibernate调用配置文件中的sql语句

    3. **执行SQL查询**:在Java代码中,我们可以使用SessionFactory的createSQLQuery方法来获取SQLQuery对象,然后调用其setParameters方法设置参数,最后调用list或uniqueResult等方法来执行查询: ```java Session ...

    常用 Hibernate 映射配置说明.doc

    通过`set`、`list`、`map`等集合节点实现一对多的关联映射,其中`inverse`属性用于控制关联关系的维护方。 #### 7. 多对一关联 `many-to-one`节点表示多对一的关系,通常涉及外键引用。 #### 8. 多对多关联 `...

    Hibernate3.1_学习源码

    案例目录: ...配置文件分别用list、set和map元素配置第二张表。 07 07Hibernate_Mapping : Hibernate中的数据关联技术,是一个重点又是一个难点,演示了 一对一、多对一、一对多、多对多等几种情况。

Global site tag (gtag.js) - Google Analytics