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

Hibernate集合映射之IDBag

阅读更多

假设Team和Student是1对多的关系,而student中只有team_id和name两个属性,我们可以不建立Student实体类,采用element的方式,由于bag可以允许重复,所以,在我们根据team删除其下某一个student的时候,hibernate不知道具体要删除哪一条数据,所以,只有讲team下所有student全部删除,然后再重新插入不应该删除的数据,这样会对效率有很大影响,针对这种情况,可以采用idbag标签,在student中加一个字段cid来唯一标识每一个student

数据库结构:

 

create table teamIDBag (id varchar(32),teamname varchar(32));
create table studentIDBag(team_id varchar(32),name varchar(32),cid varchar(32));

Pojo:

 

package Collection.IDBag;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class Team ...{
   
private String id;
   
private String teamname;
   
private List students=new ArrayList();
public String getId() ...{
    
return id;
}

public void setId(String id) ...{
    
this.id = id;
}

public String getTeamname() ...{
    
return teamname;
}

public void setTeamname(String teamname) ...{
    
this.teamname = teamname;
}

public List getStudents() ...{
    
return students;
}

public void setStudents(List students) ...{
    
this.students = students;
}


}

 Team.hbm.xml

 

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<!-- 
    Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="Collection.IDBag.Team" table="teamIDBag" >
    
<id name="id" unsaved-value="null">
      
<generator class="uuid.hex"></generator>
    
</id>
    
<property name="teamname" type="string" column="teamname"></property>
   
    
<idbag name="students" table="studentIDBag" cascade="all,delete-orphan" >
      
<collection-id type="string" column="cid">
        
<generator class="uuid.hex"></generator>
      
</collection-id>
      
<key column="team_id"></key>
      
<element type="string" column="name"></element>
    
</idbag>
</class>

</hibernate-mapping>

 

Hibernate.cfg.xml

 

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"
>

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

<session-factory>
    
<property name="connection.username">root</property>
    
<property name="connection.url">
        jdbc:mysql://localhost:3306/schoolproject?characterEncoding=gb2312
&amp;useUnicode=true
    
</property>
    
<property name="dialect">
        org.hibernate.dialect.MySQLDialect
    
</property>
    
<property name="myeclipse.connection.profile">mysql</property>
    
<property name="connection.password">1234</property>
    
<property name="connection.driver_class">
        com.mysql.jdbc.Driver
    
</property>
    
<property name="hibernate.dialect">
        org.hibernate.dialect.MySQLDialect
    
</property>
    
<property name="hibernate.show_sql">true</property>
    
<property name="current_session_context_class">thread</property>
    
<property name="jdbc.batch_size">15</property>
    
<mapping resource="Collection/IDBag/Team.hbm.xml" />




</session-factory>

</hibernate-configuration>

 

测试代码:

 

package Collection.IDBag;


import java.io.File;
import java.util.Map;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class Test ...{


    
public static void main(String[] args) ...{

        String filePath
=System.getProperty("user.dir")+File.separator+"src/Collection/IDBag"+File.separator+"hibernate.cfg.xml";
        File file
=new File(filePath);
        System.out.println(filePath);
        SessionFactory sessionFactory
=new Configuration().configure(file).buildSessionFactory();
        Session session
=sessionFactory.openSession();
        Transaction t
=session.beginTransaction();
        
    
        
//        Team team1=new Team();
//        team1.setTeamname("team1");
//        
//        Team team2=new Team();
//        team2.setTeamname("team2");
//        
//       
//       
//
//        //由于Bag映射可以重复,所以这里重复保存student
//        team1.getStudents().add("tom1");
//        team1.getStudents().add("tom1");
//        team2.getStudents().add("tom2");
//        
//        
//        
//        session.save(team1);
//        session.save(team2);
        

        Team t1
=(Team)session.createQuery("from Team t where t.teamname='team1'").uniqueResult();
        t1.getStudents().remove(
0);
        t.commit();
        
    }


}

 

运行结果:

Hibernate: select team0_.id as id0_, team0_.teamname as teamname0_ from teamIDBag team0_ where team0_.teamname='team1'
Hibernate: select students0_.team_id as team1_0_, students0_.name as name0_, students0_.cid as cid0_ from studentIDBag students0_ where students0_.team_id=?
Hibernate: delete from studentIDBag where cid=?

可以红色部分,删除student时是根据cid删的,如果不使用idbag,则会出类似delete from studentIDBag where team_id=?的操作,然后会接着跟一个insert操作,来恢复本不应该删除的数据

分享到:
评论

相关推荐

    hibernate4.1中文api

    集合映射 - **持久化集合**: 映射集合属性。 - **如何映射集合**: - **集合外键**: 使用外键映射集合。 - **索引集合**: 使用索引映射集合。 - **集合的基本类型和可嵌入的对象**: 映射集合中的不同类型。 - **...

    hibernate学习笔记

    ### Hibernate学习笔记:对象/关系数据库映射(二)——集合映射 #### 1. 集合映射概述 在对象/关系映射(ORM)领域中,Hibernate 是一个非常强大的工具,它能够帮助开发者高效地进行 Java 对象与数据库记录之间的...

    Hibernate+中文文档

    6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary ...

    Hibernate 参考文档

    - **使用&lt;idbag&gt;**:一种特殊的集合映射方式,适用于某些场景。 - **双向关联**:描述实体间相互引用的关系映射。 - **三重关联**:涉及三个实体的复杂关联映射。 - **异类关联**:不同类型的实体间的关联映射。...

    hibernate_reference中文文档.pdf

    这部分涵盖了 Hibernate 中集合映射的相关技术。 - **6.1 持久化集合类 (Persistent collections)**:介绍如何持久化集合类。 - **6.2 集合映射 ( Collection mappings )** - **6.2.1 集合外键 (Collection ...

    hibernate3.2中文文档(chm格式)

    6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary ...

    HibernateAPI中文版.chm

    6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary ...

    Hibernate中文详细学习文档

    6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary ...

    Hibernate 中文 html 帮助文档

    6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary ...

    最全Hibernate 参考文档

    1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 3.1. 可编程的配置方式 ...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    6.3. 高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary ...

    hibernate 体系结构与配置 参考文档(html)

    高级集合映射(Advanced collection mappings) 6.3.1. 有序集合(Sorted collections) 6.3.2. 双向关联(Bidirectional associations) 6.3.3. 双向关联,涉及有序集合类 6.3.4. 三重关联(Ternary ...

    Hibernate教程

    1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class 2.2.2. 映射文件 2.2.3. ...

    hibernate 教程

    开始Hibernate之旅 1.2. 第一个可持久化类 1.3. 映射cat 1.4. 与猫同乐 1.5. 结语 2. 体系结构 2.1. 总览 2.2. JMX集成 2.3. JCA支持 3. SessionFactory配置 3.1. 可编程配置方式...

    Hibernate中文API大全

    类似这样的映射允许你将一个many-to-many关联表映射为组合元素的集合。(A mapping like this allows you to map extra columns of a many-to-many association table to the composite element class.) 接下来的的...

    Hibernate3的帮助文档

    1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class 2.2.2. 映射文件 2.2.3. ...

    hibernate3.04中文文档.chm

    1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class 2.2.2. 映射文件 2.2.3...

    Hibernate3+中文参考文档

    1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 3.1. 可编程的配置方式 ...

    hibernate 框架详解

    开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class 2.2.2. 映射文件 2.2.3. ...

Global site tag (gtag.js) - Google Analytics