`
xbcoil
  • 浏览: 125882 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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>
这样就可以通过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,让数据库自己进行表的维护。

0
1
分享到:
评论

相关推荐

    hibernate中容器映射技术

    在Java持久化框架Hibernate中,容器映射技术是将Java集合类(如Set、Map、List等)与数据库中的关联关系进行映射的一种方法。这种技术使得对象之间的复杂关系能够被有效地存储和检索,增强了数据操作的灵活性。下面...

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

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

    Hibernate_容器映射技术笔记

    本篇笔记主要探讨了如何使用Hibernate进行容器映射,特别是针对集合类型的映射,如List、Set和Map。 首先,我们来看集合类型在Hibernate中的映射: 1. **单值Collection**: 这种情况通常指的是一个对象与多个其他...

    hibernate set 集合映射

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

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

    此外,自定义对象的映射是Hibernate映射中的一个重要部分。通过在实体类上使用@Entity注解,并使用@Id注解指定主键字段,可以将一个Java类映射到数据库的一张表。字段则通过@Column注解来指定列名和属性,如长度、...

    hibernate集合的映射

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

    hibernate map 集合映射

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

    hibernate array 数组映射

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

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

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

    hibernate的多种映射关系

    Hibernate 支持多种集合类型,如 List、Set、Map 等,它们可以作为一对多或多对多关系的容器。`@ElementCollection` 用于映射非实体类属性的集合,而 `@OrderColumn` 可以指定集合元素的排序方式。 6. **级联操作 ...

    Hibernate 注解映射

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

    Hibernate教程(Set映射)PDF格式

    Set映射的实现依赖于`&lt;set&gt;`标签,在Hibernate映射文件中定义。下面是一个简单的例子: ```xml &lt;set name="addrs" table="ADDRS"&gt; &lt;/set&gt; ``` 在这个例子中,`User`类有一个名为`addrs`的Set属性,该属性映射...

    hibernate bag 集合映射

    在Hibernate中,集合映射是指将数据库中的表与Java集合对象(如List、Set等)进行关联,方便对一组相关数据进行操作。 "bag"是Hibernate中的一种集合类型,表示无序的、可重复的对象集合。在数据库层面,这通常对应...

    hibernate关联映射实例

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

    [原]Hibernate集合映射

    Hibernate作为Java领域中的一款强大持久化框架,其核心功能之一就是对象关系映射(ORM),使得开发者可以方便地在Java对象与数据库表之间进行交互。其中,集合映射是Hibernate中非常关键的概念,它允许我们将数据库...

    hibernate_集合映射_set方法

    2,建立表的hibernate支持,生成tb_user类和对应的配置文件 3,修改配置文件使之和相应的类对应, 4,修改tb_user类,创建一个set类型的字段emailes,生成它的set和get方法 5,写测试类,对以上内容进行测试。 二、...

    Hibernate 多表映射关系配置

    以下是如何配置 Hibernate 的多对多映射关系。 1. 数据库建表 假设我们有两张表,`users` 和 `roles`,它们通过 `user_roles` 这个中间表进行关联。 ```sql CREATE TABLE users ( user_id INT AUTO_INCREMENT ...

    Hibernate集合映射与关联关系

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

Global site tag (gtag.js) - Google Analytics