`
舟舟同学
  • 浏览: 45447 次
  • 性别: 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 - 符合Java习惯的关系数据库持久化

    4. **双向关联**:在实体类之间建立双向引用关系,确保数据的一致性和完整性。 #### 七、关联映射 关联映射是对象关系映射中另一重要概念,主要包括: 1. **单向关联**:实体类之间存在依赖关系,但仅有一方维护...

    Hibernate ORM - 多对多双向连接表关联关系

    在Hibernate中,实现多对多双向关联主要涉及以下步骤: 1. **配置实体类**:首先,你需要为每个参与关联的实体定义一个Java类,并添加相应的属性。例如,对于“学生-课程”关系,可以有`Student`和`Course`类,它们...

    Hibernate ORM - 一对多双向关联关系

    标题“Hibernate ORM - 一对多双向关联关系”指的是在数据库建模中,Hibernate ORM(对象关系映射)框架如何处理一个实体类(如User)与多个实体类(如Article)之间的关系。在这种关系中,一个用户可以拥有多个文章...

    Hibernate ORM - 一对多双向连接表关联关系

    “Hibernate ORM - 一对多双向连接表关联关系”这个标题指出我们要讨论的是Hibernate ORM框架中的一种特定数据库关联模型,即一对多的双向关联。在Hibernate中,ORM(对象关系映射)是一种技术,它允许我们用面向...

    myeclipse试用小记----Hibernate多对一双向关联(2)

    在本篇【myeclipse试用小记----Hibernate多对一双向关联(2)】中,博主主要探讨了使用MyEclipse集成开发环境与Hibernate框架进行多对一双向关联的配置与实现。MyEclipse是Eclipse的一个强大扩展,特别适合Java Web...

    hibernateORM1-n映射

    3. **关联**:在“1”端的实体类中,我们需要定义一个集合属性,表示与“N”端实体的关联。这个集合可以是`List`、`Set`等类型,通常使用`@OneToMany`注解来声明。 4. **外键**:在“N”端的实体类中,需要有一个...

    Hibernate one-to-many / many-to-one关系映射

    3. 双向关联的管理:确保双向关联的正确维护,避免数据一致性问题。 4. 外键策略:根据数据库规范和业务需求,选择合适的外键策略,如自动生成、指定值或使用主键共享。 总结,Hibernate的one-to-many和many-to-one...

    hibernate one-to-many 单/双向关联映射配置心得

    本文主要关注Hibernate中的一个核心概念——一对一(One-to-One)、一对多(One-to-Many)和多对一(Many-to-One)关联映射,特别是关于“一到多”单向和双向关联映射的配置心得。 首先,让我们了解“一到多”关联...

    hibernate学习5之one-to-many双向关联.docx

    在Hibernate框架中,双向一对多关联映射是常见的对象关系映射(ORM)方式,用于在Java对象模型中表示数据库中的两个实体之间的多对一关系。在这个场景中,"一"端通常指的是一个实体可以拥有多个另一个实体的实例,而...

    hibernate表之间3种双向关联映射

    总结来说,Hibernate中的双向关联映射是对象关系映射的重要组成部分,包括双向多对多、双向一对多和双向一对一。理解并熟练运用这些映射方式,有助于开发者更好地实现Java应用程序与数据库间的交互,提高开发效率和...

    hibernate 多表关联 中间表

    3. **双向关联**:如果两个实体类之间是双向关联,需要在一方使用`mappedBy`属性,指明关联的属性。如上所示,Role类中的`users`属性就是User类中`roles`属性的引用。 4. **持久化操作**:在业务逻辑中,可以通过...

    hibernate 全面学习->hibernate 关联映射学习

    总之,Hibernate的关联映射是其核心功能之一,通过熟练掌握这些映射方式,开发者能够更好地管理和操作数据库,提升开发效率,降低维护成本。在实际项目中,根据具体需求选择合适的映射策略,结合源码分析和工具辅助...

    hibernate5--3.映射关系

    在Java世界中,Hibernate是一个非常流行...在使用这些关系时,需要注意双向关联的处理,以及在配置文件中正确设置懒加载和级联操作,以优化性能。同时,合理设计数据库表结构和对象模型,可以避免出现不必要的复杂性。

    Hibernate开发指南.pdf

    - **Hibernate**是一种用于Java应用程序中的对象关系映射(ORM)框架,它提供了对数据库操作的高度抽象,使得开发人员能够使用面向对象的方式处理数据库操作,从而极大地简化了数据持久化的复杂性。 - **主要特点**: ...

    Hibernate ORM - 一对多双向组合关联关系

    3. **双向关联**:双向关联意味着在子实体(学生)中也会有一个引用指向父实体(班级)。这可以通过`@ManyToOne`注解实现,并且需要在子实体类中添加一个属性来表示父实体。 4. **组合关联**:在一对多关联中,如果...

    Hibernate一对一主键关联映射(双向关联)

    在Java的持久化框架Hibernate中,一对一...总之,Hibernate的一对一主键关联映射,特别是双向关联,为Java开发提供了方便的数据持久化手段。通过正确理解和运用这些映射机制,可以更高效地管理和操作数据库中的对象。

    hibernate多对多双向关联

    总结来说,理解并能正确使用Hibernate中的多对多双向关联是Java开发中的重要技能,涉及到实体设计、映射配置、数据操作和性能优化等多个方面。通过学习提供的博客和相关代码示例,开发者可以深入掌握这一主题,并将...

    (4)Hibernate中的many-to-one和one-to-many关系

    在Java的持久化框架Hibernate中,关系映射是数据库与对象模型之间的重要桥梁。本话题主要探讨两种基本的关系映射类型:many-to-one(多对一)和one-to-many(一对多)。这两种关系映射是数据库中常见的关联类型,...

    如何使用Hibernate 双向 单-多 多-单 多-多 Hibernate.rar

    本教程将深入探讨如何使用Hibernate实现多表之间的双向关联,包括单-多、多-单、多-多关系。 **一、单-多关系** 在数据库设计中,单-多关系指的是一个实体可以与多个其他实体相关联。例如,一个学生可以属于多个...

Global site tag (gtag.js) - Google Analytics