- 浏览: 148191 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
flyingcatjj:
很适合我这种刚接触的
myeclipse xfire 开发webservice实例 -
tangzlboy:
非常好,非常详细,非常中用。
linux入门 -
yzz9i:
楼主说的很是详细。
myeclipse xfire 开发webservice实例 -
zqx888191:
很再理阿!
老程序员的教诲 -
simplecat123:
...
SQLite数据读取
十一 集合映射 set的集合配置方式在一对多 多对一 多对多中已经讲过 将不再阐述 现在来看List这种集合的映射方式 List形式的映射 部门实体 package vo.util.bean; import java.util.List; /** * 部门类 * @author Administrator * */ public class Department { private int id; private String name; private List<Employee> ems; public int getId() { return id; } public List<Employee> getEms() { return ems; } public void setEms(List<Employee> ems) { this.ems = ems; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 映射文件 <?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="vo.util.bean"> <class name="Department"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 配置一对多的映射关系 --> <!-- <set name="ems"> --> <!-- 关联关系的外键 --> <!-- <key column="depaer_id"/> --> <!-- 关联关系的实体类配置 --> <!-- <one-to-many class="Employee" /> </set> --> <list name="ems"> <key column="depaer_id"/> <!-- 这一列指定其记录顺序 这一列由hibernate来使用 --> <list-index column="ol"/> <one-to-many class="Employee"/> </list> </class> </hibernate-mapping> 映射文件分析:list标签就是配置List形式属性的标签 key是一个外键 比如说 现在我们查出了部门信息 我还想查员工信息 怎么查 key这时候就起作用了 这个键是在员工表这存在的 并且这列是作为外键而存在,它的 值就是部门表主键id 所以这就好办了 就可以查出来了 那么list-index是作什么用的呢?这个啊,是交给hibernate 使用的,是用来干什么的,是用来存放顺序的值,为什么set标签怎么就没有这个呢?这就牵扯到set与list的区别了 Set与List集合的区别 最大区别就是list可以存放重复值,并是按顺序存放的 现在知道了吧 这个list-index其实就是给hibernate存放顺序的,这个列自己可以随便定义 以上这两个列都会在部门表的从表中存在 值由hibernate自动去存的,当然这些都是在部门表的映射文件中配置的,那么当然在增加数据的时候,必须由部门对象去跟从表实体 给关联对象 否则会出现顺序这一列的值在从实体的员工表中是空值,如果利用其部门对象去获取从表的对象,将会出现空列值异常 org.hibernate.HibernateException: null index column for collection 那下面的one-to-many的class表示什么呢,表示的是list 这个属性是属于哪一个实体类 当前指定的是 Employee实体类,通过这hibernate就可以知道其从实体的表了 员工实体类 package vo.util.bean; /** * 员工类 * @author Administrator * */ public class Employee { private int id; private String name; private Department derpartment; 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 getDerpartment() { return derpartment; } public void setDerpartment(Department derpartment) { this.derpartment = derpartment; } @Override public String toString() { // TODO Auto-generated method stub return "id="+this.id+"name="+this.name; } } 映射文件 <?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="vo.util.bean"> <class name="Employee"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <many-to-one name="derpartment" column="depaer_id"/> </class> </hibernate-mapping> 测试类 package vo.util.test; import java.util.ArrayList; import java.util.List; import org.hibernate.Session; import org.hibernate.Transaction; import vo.util.HibernateUtil; import vo.util.bean.Department; import vo.util.bean.Employee; public class ManytoOne { /** * @param args */ public static void main(String[] args) { add(); Department dpart= queryDepart(1); // System.out.println(dpart.getEms()); } static Department add(){ Session session = null; Transaction tx = null; try{ session =HibernateUtil.getSession(); tx = session.beginTransaction(); //…你的代码save,delete,update,get… Department dpart=new Department(); dpart.setName("BSM部门"); Employee em1=new Employee(); em1.setName("员工许春荣"); Employee em2=new Employee(); em2.setName("员工丁辉"); em1.setDerpartment(dpart); em2.setDerpartment(dpart); List<Employee> em=new ArrayList<Employee>(); em.add(em1); em.add(em2); dpart.setEms(em); session.save(dpart); session.save(em1); session.save(em2); tx.commit(); return dpart; }finally{ if(session != null)session.close(); } } static Employee query(int id){ Session session=null; try{ session=HibernateUtil.getSession(); Employee em=(Employee)session.get(Employee.class, id); //System.out.println(em.getDerpartment().getEms()); return em; }finally{ if(session != null)session.close(); } } static Department queryDepart(int id){ Session session=null; try{ session=HibernateUtil.getSession(); session.beginTransaction(); Department dep=(Department)session.get(Department.class, id); session.beginTransaction().commit(); System.out.println(dep.getEms()); return dep; }finally{ if(session != null)session.close(); } } } 如果把上面的增加员工数据的方法 dpart.setEms(em);给注释掉 将会出现空列值异常 因为没有让部门去设置其关系 那么在部门的映射的顺序列(给hibernate使用的)ol列在员工表中出现空值的现象,导致hibernate去查询的时候,因为 在list集合里,它会按顺序把值给输出来,而现在是空值,就不知道其顺序了,所以就会报此错误 dep.getEms()这一句是 获取ems的集合数据 这个集合是list的集合 很多时候顺序并不是我所考虑的,对我来讲无所谓,还可以用另外一种映射方式,当然这种方式只是跟List集合结合使用 ,其它那是不可以的 请看 修改前的部门实体映射文件 <?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="vo.util.bean"> <class name="Department"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 配置一对多的映射关系 --> <!-- <set name="ems"> --> <!-- 关联关系的外键 --> <!-- <key column="depaer_id"/> --> <!-- 关联关系的实体类配置 --> <!-- <one-to-many class="Employee" /> </set> --> <list name="ems"> <key column="depaer_id"/> <!-- 这一列指定其记录顺序 这一列由hibernate来使用 --> <list-index column="ol"/> <one-to-many class="Employee"/> </list> </class> </hibernate-mapping> 修改后的 <?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="vo.util.bean"> <class name="Department"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <!-- 配置一对多的映射关系 --> <!-- <set name="ems"> --> <!-- 关联关系的外键 --> <!-- <key column="depaer_id"/> --> <!-- 关联关系的实体类配置 --> <!-- <one-to-many class="Employee" /> </set> --> <!-- <list name="ems"> <key column="depaer_id"/> --> <!-- 这一列指定其记录顺序 这一列由hibernate来使用 --> <!-- <list-index column="ol"/> <one-to-many class="Employee"/> </list> --> <bag name="ems"> <key column="depaer_id"/> <one-to-many class="Employee"/> </bag> </class> </hibernate-mapping> 这时在测试的时候,谁指定关系已经无所谓了,只要有一个实体对象关联另外一个实体对象就行 这时关联的对象仅仅是把外键的值给加上 在外键这个值上,为了合理必须给加上not null约束 否则如果没有对象关联其关系,也会把数据给增加上,比如说部门与员工,如果员工的外键没有给加上 这个约束,将可以给员工录入数据,这条数据就跟部门没有任何关系了,这条数据不属于任何部门 当然这个外键hibernate是放在哪个表中的,当然就由哪个表的实体去维护了,如果在主实体的映射文件的外键 配置其属性,会报其Repeated column in mapping for entity: vo.util.bean.Employee column异常 所以只需要在员工表的实体配置其属性即可 当然其关联关系当然由其从表实体员工去关联,否则如果由主表部门实体去关联,将会报非空约束异常 如果主表和从表都去关联,那么在主表保存数据的时候,它会去更新从表实体的数据,将会多出update语句 最好从表关联了,主表就不要去关联了,除非需要; package vo.util.test; import java.util.ArrayList; import java.util.List; import org.hibernate.Session; import org.hibernate.Transaction; import vo.util.HibernateUtil; import vo.util.bean.Department; import vo.util.bean.Employee; public class ManytoOne { /** * @param args */ public static void main(String[] args) { add(); Department dpart= queryDepart(1); // System.out.println(dpart.getEms()); } static Department add(){ Session session = null; Transaction tx = null; try{ session =HibernateUtil.getSession(); tx = session.beginTransaction(); //…你的代码save,delete,update,get… Department dpart=new Department(); dpart.setName("BSM部门"); Employee em1=new Employee(); em1.setName("员工许春荣"); Employee em2=new Employee(); em2.setName("员工丁辉"); //关联主表外键数据 em1.setDerpartment(dpart); em2.setDerpartment(dpart); List<Employee> em=new ArrayList<Employee>(); em.add(em1); em.add(em2); //这里已经不做关联从表的数据 //dpart.setEms(em); session.save(dpart); session.save(em1); session.save(em2); tx.commit(); return dpart; }finally{ if(session != null)session.close(); } } static Employee query(int id){ Session session=null; try{ session=HibernateUtil.getSession(); Employee em=(Employee)session.get(Employee.class, id); //System.out.println(em.getDerpartment().getEms()); return em; }finally{ if(session != null)session.close(); } } static Department queryDepart(int id){ Session session=null; try{ session=HibernateUtil.getSession(); session.beginTransaction(); Department dep=(Department)session.get(Department.class, id); session.beginTransaction().commit(); System.out.println(dep.getEms()); return dep; }finally{ if(session != null)session.close(); } } } 好了到这就结束list集合映射了 end 完毕!
发表评论
-
二十六 Hibernate实践
2011-07-04 19:18 713不适合OLAP以查询分析数据为主的系统。适合OLTP联机事务处 ... -
二十五 SQL和命名查询
2011-07-04 19:17 1034SQL和命名查询 SQL查询 //根据sql语句查询 s ... -
二十四 拦截器与监听器
2011-07-04 19:14 947在保存 更新等操作的前 ... -
二十三 iterate查询与N+1次查询的问题
2011-07-04 19:13 771test.java view plaincopy to ... -
二十二 Hibernate映射文件配置
2011-07-04 19:12 874id 主键生成方式 incremen ... -
二十一 串讲Hibernate配置文件中的配置项
2011-07-04 19:11 861数据源配置 ## JNDI Datasource ... -
二十 悲观锁和乐观锁
2011-07-04 19:10 715为了避免对对象同步操作时候产生的数据不一致问题,我们对对象采用 ... -
十九 hibernate3之缓存
2011-07-04 19:09 902什么是缓存?现在我们来看一个模拟的缓存操作 模拟一个缓存例子 ... -
十八 一对一对象的懒加载
2011-07-04 17:59 727一对一对象的懒加载,对于主的一方,lazy是无效的,它在访问数 ... -
十七 懒加载
2011-07-04 17:58 723十七 懒加载 什么是hibe ... -
十六 继承映射
2011-07-04 17:56 480第一种 一个员工类它有两个子类,利用hibernate我们把 ... -
十五 cascade 级联操作与inverse表是否放弃维护关联关系
2011-07-04 17:54 848cascade 级联操作字段 Casade用来说明当对主对 ... -
十四 在hibernate中使用集合总结
2011-07-04 17:52 876集合映射(set, list, array,bag, map) ... -
十三 array数组形式的映射
2011-07-04 17:51 829数组其实跟List的集合映射没有多大的差别,当然它不可以使用b ... -
十二 集合映射之Map集合
2011-07-04 17:49 789十二 Map集合映射 Map是以键值对的形式存放数据的 ... -
十 组件关联
2011-07-04 17:45 689组件关联 什么是组件关联呢?比如说一个用户,它的名称,有一 ... -
九 多对多关系 学生<--->老师的关系
2011-07-04 17:44 1222九 多对多关系 学生<--->老师的关系 多对多 ... -
八 一对一 用户与身份证的关系
2011-07-04 17:42 859八 一对一 用户与身份证的关系 设计用户实体 主实体 ... -
七 一对多关系 部门与员工的关系
2011-07-04 17:41 1126一对多 部门与员工的关系 相对于部门来说 一对多 根据先前 ... -
六 员工与部门——》多对以关系
2011-07-04 17:37 1017关联关系 多对一关系 员工与部门的关系 从员工角度 是 ...
相关推荐
常见的集合映射类型有 Set、List、Array、Map 和 Bag 等,每种类型都有其特点和应用场景。 Set 集合映射 Set 集合是 Hibernate 中基础的集合类型,元素数据一般使用外键同主表关联。Set 集合非常适用于集合元素不...
**标题:“Hibernate List集合映射”** 在Java的持久化框架Hibernate中,集合映射是将数据库中的表与Java对象的集合属性关联的过程。List集合映射是其中常见的一种方式,它允许我们将数据库中的一组相关记录映射到...
在Hibernate的映射文件(.hbm.xml)中,我们通常使用`<set>`, `<list>`, `<map>`等标签来定义集合映射。每个标签都有对应的属性,例如: - `name`: 对象属性名。 - `table`: 所映射的数据库表名。 - `inverse`: ...
这里的"List"是Java集合框架中的一个接口,用于存储一组有序的元素,而在Hibernate中,它常用来映射数据库中的数组、列表或集合类型的数据。本文将详细探讨如何使用Hibernate映射集合属性List,以及如何让Hibernate...
在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象模型中的集合类,如List、Set、Map等。这允许我们在Java代码中操作对象集合,而Hibernate负责处理底层的SQL查询和数据存储。本文将深入探讨`...
本主题将深入探讨Hibernate集合映射与关联关系,包括"student与Score的Map集合关系"、"student与class的多对一"以及"一对多映射"的概念。 首先,让我们理解一下Hibernate中的集合映射。在关系型数据库中,一个实体...
在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象的集合属性上,以便实现对象关系映射(ORM)。本文将深入探讨Hibernate中的四种主要集合映射类型:Set、List、Array和Map,以及它们在实际...
在C#编程语言中,标准库提供了丰富的集合类,如List、Dictionary, TValue>等。然而,有时我们需要处理一个键可以对应多个值的情况,这时标准的Dictionary类就显得力不从心了。在这种背景下,"多映射集合类"应运而生...
Hibernate支持多种集合映射类型,包括List、Set、Map、Bag、Array等。它们之间的区别主要在于元素的唯一性、顺序性和映射到数据库的实现方式。例如,List和Array维护元素的插入顺序,而Set不允许重复元素;Map则...
在Java的持久化框架Hibernate中,集合映射是至关重要的一个概念,它允许我们将数据库中的表与Java对象的集合属性进行关联。本教程主要讲解了如何在Hibernate中配置和使用集合映射,以便更好地理解和应用这个强大的...
在Hibernate中,集合映射是指将数据库中的表与Java集合对象(如List、Set等)进行关联,方便对一组相关数据进行操作。 "bag"是Hibernate中的一种集合类型,表示无序的、可重复的对象集合。在数据库层面,这通常对应...
在这个“hibernate中的集合映射范例程序”中,我们将深入探讨如何在Hibernate中进行集合映射,以及不同集合类型的应用场景。 首先,集合映射是Hibernate中处理一对多、多对多关系的核心机制。它允许我们将一个实体...
### Java集合与映射详解 #### 一、Java集合框架概览 在Java编程语言中,集合框架(Collection Framework)是一组接口和实现这些接口的类的集合,它提供了存储和操作一组对象的方式。Java集合框架主要包括两种类型...
本文主要聚焦于Hibernate框架下的集合映射机制,特别是针对`Set`、`List`、`Array`、`Map`、`Bag`五种集合类型的映射进行深入探讨。通过具体的代码示例和XML配置文件,帮助读者理解如何在Hibernate中正确地配置这些...
List集合允许元素重复,常用于表示有序的一对多或多对多关系。在Hibernate中,使用`<list>`标签进行配置。与set类似,但多了`index`属性来指定元素的顺序: ```xml <list name="studentGrades" table="GRADE" ...
集合映射是Hibernate中一个非常关键的概念,它使得Java集合类如List、Set、Map等能够与数据库中的多对一、一对多、多对多关系对应起来。在这个主题中,我们将深入探讨Hibernate集合映射的各个方面。 首先,我们来看...
本文将深入探讨Hibernate中的关联关系、CRUD操作以及集合映射(基于注解的方式)。关联关系是数据库设计中的核心概念,而Hibernate通过注解使得这种关系在代码中得以体现,简化了开发工作。 ### Hibernate关联关系 ...
本篇文章将详细介绍如何将Map和List集合转换为XML字符串,以及如何将XML字符串反向转换回Map和List集合。 首先,让我们探讨`Map`集合转成XML字符串的过程。一个`Map`对象存储键值对,可以使用各种库如`JAXB (Java ...