`

Hibernate多对多数据关联

阅读更多
多对多的关联

例如:学生选课,一个学生可以选多门课程,一门课程可以有多个学生

create table student

(

sid int primary key,

sname varchar(20) not null,

age int not null,

)

create table course

(

cid int identity(1,1) primary key,

cname varchar(20) not null,

score int not null,

)

create table studentcourse

(

sid int,

cid int,

constraint FK_CID foreign key(cid) references course(cid),

constraint FK_SID foreign key(sid) references student(sid)

)

建立POJO 类之间的关系

Student.java:

import java.util.*;

public class Student {

private int sid;

private String sname;

private int age;

private Set course=new HashSet(0);

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public Set getCourse() {

return course;

}

public void setCourse(Set course) {

this.course = course;

}

public int getSid() {

return sid;

}

public void setSid(int sid) {

this.sid = sid;

}

public String getSname() {

return sname;

}

public void setSname(String sname) {

this.sname = sname;

}

}

Course.java:

import java.util.*;

public class Course {

private int cid;

private String cname;

private int score;

private Set student=new HashSet(0);

public int getCid() {

return cid;

}

public void setCid(int cid) {

this.cid = cid;

}

public String getCname() {

return cname;

}

public void setCname(String cname) {

this.cname = cname;

}

public int getScore() {

return score;

}

public void setScore(int score) {

this.score = score;

}

public Set getStudent() {

return student;

}

public void setStudent(Set student) {

this.student = student;

}

}


配置映射文件:

Student.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">

<hibernate-mapping>

<class name="student.Student" table="student" catalog="myshop" schema="dbo">

<id name="sid" type="java.lang.Integer">

<column name="sid"></column>

<generator class="assigned"></generator>

</id>

<property name="sname" type="java.lang.String">

<column name="sname" length="20" not-null="true"></column>

</property>

<property name="age" type="java.lang.Integer">

<column name="age" length="20" not-null="true"/>

</property>

<!--name表示Student类中Set的名称,多对多使用studentcourse表维护关系 -->

<set name="course" table="studentcourse" cascade="all">

<key>

<!-- 学生表在关系表中的外键 -->

<column name="sid"></column>

</key>

<!--Set集合中每个元素的类型, -->

<many-to-many class="student.Course">

<!-- 在关系表中的外键 -->

<column name="cid"></column>

</many-to-many>

</set>

</class>

</hibernate-mapping>


Course.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">

<hibernate-mapping>

<class name="student.Course" table="course" catalog="myshop" schema="dbo">

<id name="cid" type="java.lang.Integer">

<column name="cid"></column>

<generator class="native"></generator>

</id>

<property name="cname" type="java.lang.String">

<column name="cname" length="20" not-null="true"></column>

</property>

<property name="score" type="java.lang.Integer">

<column name="score" not-null="true"/>

</property>

<!-- name 表示Course中Set集合名称,及使用的关系表 -->

<!-- inverse 表示是否有主动权,为true表示没有主动权

如果这里不把inverse设置成false,那么还会插入一条

-->

<set name="student" table="studentcourse" inverse="true">

<key>

<!-- 课程表在关系表中的外键 -->

<column name="cid"></column>

</key>

<!--Set集合中每个元素的类型 -->

<many-to-many class="student.Student">

<!--Student表在关系表中的外键 -->

<column name="sid"></column>

</many-to-many>

</set>

</class>

</hibernate-mapping>


测试类:

import java.util.*;

import org.hibernate.*;

import org.hibernate.cfg.*;

public class Test {

private SessionFactory sessionFactory;

private Session session;

public Test()

{

sessionFactory=new Configuration().configure().buildSessionFactory();

session=sessionFactory.openSession();

}

public void doCreate()

{

Student s1=new Student();

Student s2=new Student();

s1.setSid(3);

s1.setSname("张三");

s1.setAge(20);

s2.setSid(2);

s2.setSname("李四");

s2.setAge(22);

Course c1=new Course();

c1.setCname("JAVA");

c1.setScore(98);

s1.getCourse().add(c1);

s2.getCourse().add(c1);

c1.getStudent().add(s1);

c1.getStudent().add(s2);

session.save(s1);

session.beginTransaction().commit();

session.close();

}


public static void main(String[]args)

{

new Test().doCreate();

}

}

运行结果:

Hibernate: insert into myshop.dbo.student (sname, age, sid) values (?, ?, ?)

Hibernate: insert into myshop.dbo.course (cname, score) values (?, ?)

Hibernate: insert into studentcourse (sid, cid) values (?, ?)

此时,插入的只是第一个学生,如果在插入第二个学生,你会发现课程名称也被插入。这是因为对于Hibernate来说课程是一个新的实体,如果

是新的实体,则肯定会重新插入



public void doCreate()

{

Student s1=new Student();

s1.setSid(4);

s1.setSname("王五");

s1.setAge(20);

Course c1=(Course)session.get(Course.class, 1);

c1.setCname("JAVA");

c1.setScore(98);

s1.getCourse().add(c1);

c1.getStudent().add(s1);

session.save(s1);

session.beginTransaction().commit();

session.close();

}


分享到:
评论

相关推荐

    hibernate多对多关联映射

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...

    hibernate多对多关联映射(单项关联)

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系模型,它用于处理两个实体类之间存在多个对应关系的情况。这篇博客"hibernate多对多关联映射(单项关联)"深入探讨了如何在Hibernate中实现这种映射...

    hibernate多对多双向关联

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

    Hibernate多对多关联添加及查询示例

    本示例主要关注的是Hibernate中的多对多关联映射及其添加与查询方法。 多对多关联是数据库设计中的一种常见关系类型,指的是两个实体之间可以存在多个对应关系。例如,在学生与课程的关系中,一个学生可以选修多门...

    hibernate一对多,多对一,一对多双向关联

    “Hibernate 一对多,多对一,一对多双向关联”是指在Java持久化框架Hibernate中,实体间常见的三种关联关系。在数据库设计中,这种关联关系是常见的,例如一个用户可以有多个订单(一对多),一个订单对应一个用户...

    Hibernate一对一,一对多,多对多实例

    本实例将深入探讨Hibernate中的三种基本关联关系:一对一(One-to-One)、一对多(One-to-Many)以及多对多(Many-to-Many)的实现方式。 1. **一对一关联**: 一对一关联通常出现在两个实体之间存在唯一对应关系...

    hibernate多对一关联关系

    在Java的持久化框架Hibernate中,"多对一"关联关系是一种常见的对象关系映射(ORM)设计,它表示一个实体(子项)可以与多个其他实体(父项)相关联,而每个父项可能被多个子项引用。在数据库层面,这通常对应于一个...

    Hibernate 多对多关联

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关联是一种常见的数据库关系映射,它允许一个实体类中的多个实例与另一个实体类的多个实例相互关联。在这个场景下,"Hibernate 多对多关联"的问题可能是由于...

    hibernate实现多对多关联关系源码

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关联关系是一种常见的实体间关系类型,它表示一个实体可以与多个其他实体相关联,反之亦然。本源码示例将深入探讨如何使用Hibernate来配置和管理这种复杂的...

    Hibernate映射一对多关联关系

    ### Hibernate映射一对多关联关系 #### 知识点概览 - **概念解析**:一对多(One-to-Many)关联关系的概念及其在Hibernate中的实现方式。 - **域模型设计**:创建具有一个实体与多个实体关联的域模型。 - **关系...

    Hibernate多对多关联关系demo

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关联关系是一种常见的实体间关系类型,它表示一个实体可以与多个其他实体相关联,反之亦然。本示例"Hibernate多对多关联关系demo"将深入探讨如何在实际开发中...

    hibernate多对多

    在Java的持久化框架Hibernate中,多对多(Many-to-Many)关系是数据库中常见的关联类型,它允许一个实体实例对应多个其他实体实例,反之亦然。在本案例中,我们将深入探讨如何使用Hibernate来处理多对多的关系映射,...

    hibernate一对多关联映射(单向关联)

    在Java的持久化框架Hibernate中,一对多关联映射是一种常见的关系映射方式,它用于表示一个实体(如用户)可以拥有多个关联实体(如订单)。在这个场景中,"一"通常代表父实体,"多"代表子实体。这篇博客文章...

    hibernate一对一关联关系

    在实体类之间,Hibernate支持多种关联关系,包括一对一(One-to-One)、一对多(One-to-Many)和多对多(Many-to-Many)。本资源主要探讨的是“hibernate一对一关联关系”。 一对一关联关系在现实世界中很常见,...

    Hibernate基于连接表的一对多单向关联

    在上述代码中,我们使用了注解`@ManyToOne`和`@JoinColumn`来声明`Address`类中的`person`字段是一个多对一的关联,并指定了外键列的名称。 3. 数据库表结构:`personAdd.sql`可能包含了创建`Person`和`Address`表...

    hibernate 多对多源代码

    本篇将深入探讨Hibernate如何处理这种复杂的数据关联。 一、多对多关系的基本概念 在数据库设计中,多对多关系意味着两个表之间存在复杂的关系。例如,学生和课程的关系,一个学生可以选修多门课程,而一门课程也...

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

    本文将深入探讨Hibernate ORM中的一个关键概念——多对多双向连接表关联关系。这种关联关系在实际业务场景中非常常见,比如用户与角色、课程与学生等例子,都需要用到多对多的关系来描述它们之间的复杂联系。 首先...

    hibernate双向多对多关联映射(注解版)

    总结,理解并正确使用Hibernate的双向多对多关联映射是提升Java应用数据管理效率的关键。通过注解方式配置,可以使代码更加简洁且易于维护。在实际开发中,应根据业务需求来决定是否使用双向关联,以及如何维护这种...

    hibernate多对多查询

    本篇文章将聚焦于Hibernate中的多对多查询,这是一个复杂但常见的数据关联问题。 首先,我们需要理解关系数据库中的多对多关系。在现实生活中,很多关系都呈现出多对多的特性,例如学生与课程之间的关系,一个学生...

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

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

Global site tag (gtag.js) - Google Analytics