`
舟舟同学
  • 浏览: 44422 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

hibernate开发3--数据库表双向n-n关联

阅读更多

多对多关联也是一种极为常见的关联关系,比如一个学生可以选修多门课程,一门课程也可以有多名学生选修,要实现查询一个学生所选的所有课程的和查询一门课程所有选修的学生就需要用到多对多的关联关系。多对多的基本原理是在数据库中另外创建一张表来管理表与表之间的联系,关键配置为*.hbm.xml文件中的set的配置,用到的标签为:many-to-many 。

以一个学生可以选修多门课程,一门课程也可以有多名学生选修为例:

一、创建多的一端student类

package cn.test.Bean;
import java.util.HashSet;
import java.util.Set;
public class student {
 private Long id;
 private String name;
 private Set<Course> course=new HashSet<Course>();
 public Long getId() {
  return id;
 }
 public void setId(Long id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Set<Course> getCourse() {
  return course;
 }
 public void setCourse(Set<Course> course) {
  this.course = course;
 } 
}

其student.hbm.xml文件配置如下

<?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>
<class name="cn.test.Bean.student" table="student">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<set name="course" table="st_cou" cascade="save-update">
<key column="id"></key>
<many-to-many column="cid" class="cn.test.Bean.Course"></many-to-many>
</set>
</class>
</hibernate-mapping>

说明:在映射文件中,使用的set元素对student类中course属性进行配置,name属性为指定属性名,table为指定的连接的表名称,子元素key中,使用colum属性指定连接表中引用student表的外键为id。在many-to-many 元素中,使用class属性指定集合属性course中存储Course类对象,并使用colum元素指定连接表中引用course表的外键为cid。

二、建立多的一端Course类

package cn.test.Bean;
import java.util.HashSet;
import java.util.Set;

public class Course {
 private Long cid;
 private String cname;
 private Set<student> st=new HashSet<student>();
 public Long getCid() {
  return cid;
 }
 public void setCid(Long cid) {
  this.cid = cid;
 }
 public String getCname() {
  return cname;
 }
 public void setCname(String cname) {
  this.cname = cname;
 }
 public Set<student> getSt() {
  return st;
 }
 public void setSt(Set<student> st) {
  this.st = st;
 }
}
其Course.hbm.xml文件配置如下:

<?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>
<class name="cn.test.Bean.Course" table="Course">
<id name="cid">
<generator class="native"></generator>
</id>
<property name="cname"></property>
<set name="st" table="st_cou" cascade="save-update">
<key column="cid"></key>
<many-to-many column="id" class="cn.test.Bean.student"></many-to-many>
</set>
</class>
</hibernate-mapping>
编写测试类,查询所有选修了课程为数学的学生名称

package cn.test.hibernate;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.junit.Test;
import cn.test.Bean.Course;
import cn.test.Bean.student;
public class testnton {
 private SessionFactory sessionFactory;
 @Test
 public void nton()
 {
 final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
 .configure() // configures settings from hibernate.cfg.xml
 .build();
    sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory();
    Session session =sessionFactory.openSession();
  student st1=new student();
   student st2=new student();
   Course c1=new Course();
   Course c2=new Course(); 
   c1.setCname("语文");
    c2.setCname("数学");
    st1.setName("zs");
    Set<Course> cc1=new HashSet<Course>();
    Set<Course> cc2=new HashSet<Course>();
    cc2.add(c2);
    cc1.add(c1);
    cc1.add(c2);
    st2.setName("lisi");
    st1.setCourse(cc1);
    st2.setCourse(cc2);
    session.beginTransaction();
    session.save(st1);
    session.save(st2);
    List<Course> stu=session.createQuery("FROM Course c where c.cname='数学'").list();//得到课程名称数学的课程类
    for(int i=0;i<stu.size();i++)
    {
     Iterator<student> it = stu.get(i).getSt().iterator();//取选修了课程为数学的学生的名字
     while(it.hasNext())//判断是否有下一个
     {
     System.out.println(it.next().getName());
     }
    }
    session.getTransaction().commit();
    session.close();
 }
}

我们可以打开数据库,数据库中有三张表格,一张为student,一张为Course,还有一张连接表st_cou。

0
1
分享到:
评论

相关推荐

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

    7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂...

    hibernate学习笔记

    hibernate一对一主键关联映射(双向关联Person&lt;----&gt;IdCard) 9 hibernate一对一唯一外键关联映射(单向关联Person----&gt;IdCard) 10 hibernate一对一唯一外键关联映射(双向关联Person&lt;----&gt;IdCard) 11 session ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     7.2 映射一对多双向关联关系  7.2.1 元素的inverse属性  7.2.2 级联删除  7.2.3 父子关系  7.3 映射一对多双向自身关联关系  7.4 改进持久化类  7.5 小结  7.6 思考题 第8章 通过Hibernate操纵对象(上) ...

    HibernateAPI中文版.chm

    7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂...

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

    7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂...

    Hibernate+中文文档

    7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂...

    Hibernate中文API大全

    当然,当你定义Item时,你无法引用这些purchase,因此你无法实现双向关联查询。记住组件是值类型,并且不允许共享引用。某一个特定的Purchase 可以放在Order的集合中,但它不能同时被Item所引用。 其实组合元素的...

    Hibernate注释大全收藏

    这种策略支持双向的一对多关联,但不支持 IDENTIFY 生成器策略,因为ID必须在多个表间共享。一旦使用就不能使用AUTO和IDENTIFY生成器。 每个类层次结构一张表 @Entity @Inheritance(strategy=InheritanceType....

    Hibernate3的帮助文档

    8.5. 使用连接表的双向关联(Bidirectional associations with join tables) 8.5.1. 一对多(one to many) /多对一( many to one) 8.5.2. 一对一(one to one) 8.5.3. 多对多(many to many) 9. 组件...

    Hibernate中文详细学习文档

    7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂...

    Hibernate 中文 html 帮助文档

    7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的...

    Hibernate实战(第2版 中文高清版)

     1.4.4 Hibernate、EJB 3和JPA简介   1.5 小结   第2章 启动项目   2.1 启动Hibernate项目   2.1.1 选择开发过程   2.1.2 建立项目   2.1.3 Hibernate配置和启动   2.1.4 运行和测试应用程序   2.2...

    精通hibernate:对象持久化技术孙卫琴第二版part2

    7.2 映射一对多双向关联关系 156 7.2.1 [set]元素的inverse属性 161 7.2.2 级联删除 163 7.2.3 父子关系 164 7.3 映射一对多双向自身关联关系 165 7.4 改进持久化类 171 7.5 小结 175 7.6 思考题 176 第8章 ...

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

    使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 7.6. 更复杂的...

    Hibernate3+中文参考文档

    7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 8. 组件...

    Hibernate教程

    8.5. 使用连接表的双向关联(Bidirectional associations with join tables) 8.5.1. 一对多(one to many) /多对一( many to one) 8.5.2. 一对一(one to one) 8.5.3. 多对多(many to many) 9. 组件...

    基于Jsp的在线考试系统毕业设计论文

    所有的数据库表不是用mysql企业管理器或查询分析器来完成的,而是用hibernate的pojo类和hbm.xml文件导入的,然而,配置这些关联映射却很麻烦,往往考虑不到而配置成单向关联,在开发过程中又发现双向关联都用到了,...

    精通Hibernate:对象持久化技术第二版part3

    7.2 映射一对多双向关联关系 156 7.2.1 [set]元素的inverse属性 161 7.2.2 级联删除 163 7.2.3 父子关系 164 7.3 映射一对多双向自身关联关系 165 7.4 改进持久化类 171 7.5 小结 175 7.6 思考题 176 第8章 ...

    最全Hibernate 参考文档

    7.5. 使用连接表的双向关联(Bidirectional associations with join tables) 7.5.1. 一对多(one to many) /多对一( many to one) 7.5.2. 一对一(one to one) 7.5.3. 多对多(many to many) 8. 组件...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    10.5.7 双向N-N关联 420 10.5.8 使用Map集合记录关联实体 423 10.5.9 对关联实体进行排序 424 10.6 继承关系映射 426 10.6.1 整个类层次对应一张表的 映射策略 427 10.6.2 连接子类的映射策略 430 10.6.3 每个具体...

Global site tag (gtag.js) - Google Analytics