`

hibernate set映射

阅读更多

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 set 集合映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象模型中的集合类,如List、Set、Map等。这允许我们在Java代码中操作对象集合,而Hibernate负责处理底层的SQL查询和数据存储。本文将深入探讨`...

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

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

    hibernate关联映射实例

    这种映射可以通过集合类型如List、Set等来表示子项的集合。 2. **多对多关联映射**: 多对多关联是两个实体之间都可以有多个匹配项的情况,比如学生和课程的关系。在Hibernate中,我们可以使用`@ManyToMany`注解来...

    [原]Hibernate集合映射

    Hibernate支持多种集合映射类型,包括List、Set、Map、Bag、Array等。它们之间的区别主要在于元素的唯一性、顺序性和映射到数据库的实现方式。例如,List和Array维护元素的插入顺序,而Set不允许重复元素;Map则...

    Hibernate集合映射与关联关系

    在Hibernate中,我们可以使用集合类(如List、Set、Map等)来映射这些关系。例如,一个学生可以有多次成绩记录,这就构成了一个学生到成绩的映射关系,通常我们使用Map来表示这种关系,因为Map能确保每个学生都有...

    Hibernate教程(Set映射)PDF格式

    ### Hibernate教程:Set映射详解 #### 一、前言 在Java开发中,对象关系映射(ORM)框架Hibernate是连接Java应用与数据库的重要工具之一。它通过配置文件或注解的方式,将Java对象映射到数据库表,并提供了一系列...

    Hibernate 注解映射

    Hibernate 注解映射 Hibernate 注解映射是 Hibernate 框架中的一种映射方式,它使用 Java 注解来描述实体类和数据库表之间的映射关系,提高开发效率。 一、 环境搭建和基本映射 在使用 Hibernate 注解映射之前,...

    hibernate关联映射的作用和常用属性解释

    ### Hibernate关联映射的作用与常用属性详解 #### 关联映射概述 在对象关系映射(Object Relational Mapping,简称ORM)技术中,Hibernate作为Java领域内非常成熟且功能强大的框架之一,它允许开发者将Java类映射...

    hibernate集合的映射

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

    hibernate array 数组映射

    在Java的持久化框架Hibernate中,数组映射是一种常见的数据模型转换方式,它允许我们将数据库中的数据以数组的形式存储在Java对象中。本篇将详细探讨`hibernate array 数组映射`的相关知识点,包括其原理、配置、...

    Hibernate映射树形结构

    在IT行业中,数据库管理和对象关系映射(ORM)框架是至关重要的组成部分,特别是对于Java开发者而言,Hibernate是一个广泛使用的ORM工具。本篇文章将深入探讨如何在Hibernate中映射树形结构,这是一种处理复杂数据...

    JAVA数据类型与Hibernate的类型映射

    对于数组和集合,如List、Set、Map等,Hibernate提供了ListType、SetType、MapType等映射类型,可以根据实际需求选择。 此外,自定义对象的映射是Hibernate映射中的一个重要部分。通过在实体类上使用@Entity注解,...

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

    Hibernate 集合映射详解 Hibernate 是一个流行的Java持久化框架,它提供了多种集合映射类型,以满足不同的业务需求。在 Hibernate 中,集合映射是指将 Java 集合类型与数据库表之间的映射关系。常见的集合映射类型...

    hibernate map 集合映射

    在Hibernate的映射文件(.hbm.xml)中,我们通常使用`&lt;set&gt;`, `&lt;list&gt;`, `&lt;map&gt;`等标签来定义集合映射。每个标签都有对应的属性,例如: - `name`: 对象属性名。 - `table`: 所映射的数据库表名。 - `inverse`: ...

    Hibernate映射配置实例大全(详细总结)

    例如,`&lt;set&gt;`用于映射Java集合到数据库的表,`&lt;list&gt;`映射到有序的列表,`&lt;map&gt;`映射到键值对,`&lt;bag&gt;`则用于无序集合。每个集合映射都可以配置元素类型、排序规则以及关联的表。 在配置中,我们还需要关注懒加载...

    用Hibernate映射继承关系

    在Hibernate中,可以通过使用`Set`和`Map`集合类型来实现多态关联,其中`Set`存储对象实例,`Map`存储对象实例及其类型标识符。 #### 14.6 小结 映射继承关系是Hibernate中一项高级特性,它允许你将面向对象的设计...

    hibernate组建映射代码

    **hibernate组建映射代码详解** 在Java开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本篇将深入解析“hibernate组建映射”这一主题,帮助初学者理解如何在Hibernate中...

    Hibernate关联映射

    在 Hibernate 映射中,需要使用 `one-to-one` 元素,并设置 `constrained="true"`,表明该类的主键由关联类生成。 3. Hibernate 一对一连接表单向关联: 这种关联方式是通过额外的连接表来实现一对一关系的。连接...

    hibernate关系映射网址

    ### Hibernate关系映射详解 #### 一、引言 Hibernate是一种广泛使用的Java持久化框架,它简化了对象关系映射(Object-Relational Mapping,简称ORM)的过程,使得开发人员可以更加专注于业务逻辑的实现而无需过多...

Global site tag (gtag.js) - Google Analytics