- 浏览: 519151 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (278)
- java (41)
- 设计模式 (4)
- sql (10)
- webservice (2)
- spring (9)
- struts (6)
- struts2 (32)
- hibernate (27)
- Struts_hibernate_Spring整合 (4)
- Velocity (1)
- Servlet (9)
- JSP (6)
- javascript (19)
- jquery (10)
- ajax (4)
- html、xml (3)
- JDBC (2)
- JDK (6)
- mysql (2)
- oracle (11)
- SqlServer (1)
- DB2 (4)
- tool (7)
- linux (5)
- UML (1)
- eclipse (8)
- 执行文件 (1)
- 应用服务器 (4)
- 代码重构 (1)
- 日本語 (19)
- 交规 (1)
- office (9)
- firefox (1)
- net (1)
- 测试 (1)
- temp (6)
- 对日外包 (1)
- windows (1)
- 版本控制 (1)
- android (2)
- 项目管理 (1)
最新评论
Hibernate之容器映射
Set映射 两张表对应一个类
CREATE TABLE person ( id INT identity(1,1) NOT NULL PRIMARY KEY, name VARCHAR(100) NOT NULL ); CREATE TABLE emails ( id INT NOT NULL, address VARCHAR(100) NOT NULL );
一条person记录对应多条email记录,我们用set,因为元素不重复.
public class Person { private Integer id; private String name; //一个人拥有多个不同的email地址 private Set emails; getter和setter }
从person表创建映射
映射文件为
<hibernate-mapping> <class name="com.zhv.pojo.Person" table="person" catalog="bbs"> <id name="id" type="integer"> <column name="id" /> <generator class="native"></generator> </id> <property name="name" type="string"> <column name="name" length="100" not-null="true" /> </property> </class> </hibernate-mapping>
应当对这个文件进行修改
在person表中加入Set集合,集合内容为emails表中全部数据
<set name="emails" table="eails">//对应Person类中字段,表是emails表 <key column="id"></key> //按照id关联 <element type="java.lang.String" column="address"></element> //集合email中的元素是对应address字段,为String类型 </set>
set中映射到class
<set name="images" table="IMAGES" lazy="true" order-by="IMAGE_NAME asc"> <key column="CUSTOMER_ID"></key> <composite-element class="mypack.Image"> <parent name="customer"/> <property name="name" column="IMAGE_NAME"></property> <property name="filename" column="FILENAME"></property> </composite-element> </set>
这样就可以通过person一个类来操作两张表
public static void main(String[] args) { Person p = new Person(); p.setName("李杏花"); Set set = new TreeSet(); set.add("abc@126.com"); set.add("def@263.net"); set.add("seg@tom.com"); p.setEmails(set); PersonOper po = new PersonOper(); po.insert(p); }
Hibernate: insert into bbs.person (name) values (?)
Hibernate: insert into emails (id, address) values (?, ?)
Hibernate: insert into emails (id, address) values (?, ?)
Hibernate: insert into emails (id, address) values (?, ?)
在 Hibernate3中,有延迟加载机制.所谓的延迟加载就是指当程序用到数据的时候才自行加载.
public Person queryById(int id) { Person p = null; String hql = "FROM Person as p where p.id=?"; Query q = this.session.createQuery(hql); q.setInteger(0,id); Iterator itr = q.list().iterator(); if(itr.hasNext()) { p = (Person)itr.next(); } this.session.close(); return p; } public static void main(String[] args) { PersonOper po = new PersonOper(); Person p = po.queryById(1); System.out.println(p.getName()); System.out.println(p.getEmails()); }
报错!
failed to lazily initialize a collection of role: com.zhv.pojo.Person.emails - no session or session was closed
就是因为延迟加载
实际执行SQL语句为
Hibernate: select person0_.id as id, person0_.name as name0_ from bbs.person person0_ where person0_.id=?
根本就没有执行对emails表的查询。
设置就在 set的lazy属性中,默认是true。
如果不关闭session就没有问题了。
当设置为false的时候,就可以查出来
Hibernate: select person0_.id as id, person0_.name as name0_ from bbs.person person0_ where person0_.id=?
Hibernate: select emails0_.id as id0_, emails0_.address as address0_ from emails emails0_ where emails0_.id=?
上来就卡插卡插都给查出来了。
Hibernate中提供的delete方法最大缺点就是必须首先把数据查询出来在进行删除,最好的做法是将数据按照id进行删除,but按照id删除,必须使用hql,但是hql能删除person,不能删除 emails,最好的方法是在数据库里面加入外键foreign key,让数据库自己进行表的维护。
发表评论
文章已被作者锁定,不允许评论。
-
Hibernate 配置 说明
2011-11-29 09:05 1480Hibernate配置说明 <?xm ... -
hibernate 相关问题 (一)
2011-04-06 13:50 1465一、Hibernate缓存深入详解 看附件 ... -
Hibenrate 中 inverse="true"
2010-09-19 10:12 1059转:http://www.iteye.com/to ... -
hibernate 3.0 中 批量更新,批量删除
2010-09-09 12:51 980hibernate 2.1没有对批量更新和批量删除提供很好的支 ... -
hibernate one-to-one
2010-09-07 15:56 1426一。 1. 完全的一对一关系,即A与B两种实体,分两个表格, ... -
hibernate many-to-many
2010-09-07 15:26 882Inverse是hibernate双向关系 ... -
hibernate 集合排序 二 (数据库排序)
2010-09-03 11:03 1142<set><idbag>< ... -
hibernate 集合排序 一 (内存排序)
2010-09-03 10:52 1084内存中排序 <set><map ... -
hibernate map映射
2010-09-03 10:46 1022Person.java package com.aa ... -
hibernate list映射
2010-09-03 10:41 1116Answer类为Question类一对多关联关系,即一个问题对 ... -
hibernate idbag映射
2010-09-03 10:35 1049假设Team和Student是1对多的关系,而studen ... -
hibernate 二级缓存(三)
2010-08-31 11:00 1368过这篇文章纪录hibernate二级缓存的一些使用经历,利用几 ... -
hibernate 二级缓存(二)
2010-08-31 10:48 11401 启用 Hibernate 二级缓存 Hibe ... -
hibernate 二级缓存(一)
2010-08-31 10:29 1847一。 1 . Hibernate ... -
hibernate 事务 并发
2010-08-27 10:17 1386数据库事务与并发 ... -
hibernate 执行 本地 sql
2010-08-25 10:47 17471.为了把sql查询返回的关系数据映射为对象,需 ... -
Hibernate3的配置参数汇总
2010-08-25 10:22 7551、Hibernate JDBC属性 属 ... -
正确理解 hibernate 的 inverse many-to-many
2010-08-25 10:18 820Inverse是hibernate双向关系 ... -
Hql 语法
2010-08-19 14:40 920HQL是完全面向对象的查询语言,因此可以支持继承和多态等特征。 ... -
hibernate检索策略(类级别检索,关联基本检索,延迟加载...)(二)
2010-08-16 22:36 1400转:http://blog.csdn.net/qking934 ...
相关推荐
在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象模型中的集合类,如List、Set、Map等。这允许我们在Java代码中操作对象集合,而Hibernate负责处理底层的SQL查询和数据存储。本文将深入探讨`...
Hibernate容器映射技术(Set、List、Map)
这种映射可以通过集合类型如List、Set等来表示子项的集合。 2. **多对多关联映射**: 多对多关联是两个实体之间都可以有多个匹配项的情况,比如学生和课程的关系。在Hibernate中,我们可以使用`@ManyToMany`注解来...
### Hibernate关联映射总结 #### 一、基础知识 在探讨Hibernate中的关联映射之前,我们需要先理解几个基本概念,这将有助于我们更好地理解和应用这些关联映射。 - **主键**(Primary Key):主键是用来唯一标识一...
Hibernate支持多种集合映射类型,包括List、Set、Map、Bag、Array等。它们之间的区别主要在于元素的唯一性、顺序性和映射到数据库的实现方式。例如,List和Array维护元素的插入顺序,而Set不允许重复元素;Map则...
在Hibernate中,我们可以使用集合类(如List、Set、Map等)来映射这些关系。例如,一个学生可以有多次成绩记录,这就构成了一个学生到成绩的映射关系,通常我们使用Map来表示这种关系,因为Map能确保每个学生都有...
### Hibernate教程:Set映射详解 #### 一、前言 在Java开发中,对象关系映射(ORM)框架Hibernate是连接Java应用与数据库的重要工具之一。它通过配置文件或注解的方式,将Java对象映射到数据库表,并提供了一系列...
Hibernate 注解映射 Hibernate 注解映射是 Hibernate 框架中的一种映射方式,它使用 Java 注解来描述实体类和数据库表之间的映射关系,提高开发效率。 一、 环境搭建和基本映射 在使用 Hibernate 注解映射之前,...
### Hibernate关联映射的作用与常用属性详解 #### 关联映射概述 在对象关系映射(Object Relational Mapping,简称ORM)技术中,Hibernate作为Java领域内非常成熟且功能强大的框架之一,它允许开发者将Java类映射...
本文将深入探讨Hibernate中的四种主要集合映射类型:Set、List、Array和Map,以及它们在实际开发中的应用场景和配置。 一、Set集合映射 Set集合映射是最常见的映射类型,它不允许重复元素。在Hibernate中,Set通常...
在Java的持久化框架Hibernate中,数组映射是一种常见的数据模型转换方式,它允许我们将数据库中的数据以数组的形式存储在Java对象中。本篇将详细探讨`hibernate array 数组映射`的相关知识点,包括其原理、配置、...
在IT行业中,数据库管理和对象关系映射(ORM)框架是至关重要的组成部分,特别是对于Java开发者而言,Hibernate是一个广泛使用的ORM工具。本篇文章将深入探讨如何在Hibernate中映射树形结构,这是一种处理复杂数据...
对于数组和集合,如List、Set、Map等,Hibernate提供了ListType、SetType、MapType等映射类型,可以根据实际需求选择。 此外,自定义对象的映射是Hibernate映射中的一个重要部分。通过在实体类上使用@Entity注解,...
Hibernate 集合映射详解 Hibernate 是一个流行的Java持久化框架,它提供了多种集合映射类型,以满足不同的业务需求。在 Hibernate 中,集合映射是指将 Java 集合类型与数据库表之间的映射关系。常见的集合映射类型...
在Hibernate的映射文件(.hbm.xml)中,我们通常使用`<set>`, `<list>`, `<map>`等标签来定义集合映射。每个标签都有对应的属性,例如: - `name`: 对象属性名。 - `table`: 所映射的数据库表名。 - `inverse`: ...
例如,`<set>`用于映射Java集合到数据库的表,`<list>`映射到有序的列表,`<map>`映射到键值对,`<bag>`则用于无序集合。每个集合映射都可以配置元素类型、排序规则以及关联的表。 在配置中,我们还需要关注懒加载...
在Hibernate中,可以通过使用`Set`和`Map`集合类型来实现多态关联,其中`Set`存储对象实例,`Map`存储对象实例及其类型标识符。 #### 14.6 小结 映射继承关系是Hibernate中一项高级特性,它允许你将面向对象的设计...
**hibernate组建映射代码详解** 在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本篇将深入解析“hibernate组建映射”这一主题,帮助初学者理解如何在Hibernate中...
在 Hibernate 映射中,需要使用 `one-to-one` 元素,并设置 `constrained="true"`,表明该类的主键由关联类生成。 3. Hibernate 一对一连接表单向关联: 这种关联方式是通过额外的连接表来实现一对一关系的。连接...
### Hibernate关系映射详解 #### 一、引言 Hibernate是一种广泛使用的Java持久化框架,它简化了对象关系映射(Object-Relational Mapping,简称ORM)的过程,使得开发人员可以更加专注于业务逻辑的实现而无需过多...