`

hibernate单向一对多关联

 
阅读更多

类图如下:



 

 

在关系模型中,同多对一一样,还是在Student表中有一个外键指向Class表。

在配置的时候需要注意了,Student配置文件不需要进行额外的配置了,需要进行额外配置的是MyClass的配置文件,需要通过set标签配置,这里set标签也是有两个作用的,一为数据库服务,第二位程序服务。

 

MyClass.java
package com.org.model;

import java.util.HashSet;
import java.util.Set;



public class MyClass {
	private int id;
	private String name;
	private Set<Student> students =  new HashSet<Student>();
	
	public Set<Student> getStudents() {
		return students;
	}
	public void setStudents(Set<Student> students) {
		this.students = students;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	

}
 Student.java
package com.org.model;



public class Student {
	private int id;
	private String name;
	
	public  Student(){}
	public Student(String name){
		this.name = name;
	}
	
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	

}
 MyClass.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.org.model">
	<class name="MyClass" table="class">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name" not-null="true"/>
		
		<!-- set标签中的name为MyClass类中多方对应的属性名        key标签中的column为多方数据库表中的外键字段-->
		<set name="students" cascade="save-update">
			<key column="class_id" not-null="true"></key>
			
			<one-to-many class="Student"/>      <!-- class表明set中放的是什么类型的集合 -->
		</set>
	</class>


</hibernate-mapping>
 Student.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="com.org.model">
	<class name="Student" table="student">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name" column="name" not-null="true"/>
		
		</class>


</hibernate-mapping>
 测试类HibernateTest.java
package com.org.model.test;

import java.util.HashSet;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import com.org.model.MyClass;
import com.org.model.Student;
import com.org.util.HibernateUtil;

public class HibernateTest {

	@Test
	public void testSave1() {
		Session session = null;
		Transaction tx = null;
		try {

			// 拿到session
			session = HibernateUtil.getSession();
			System.out.println(session);
			// 开启事务
			tx = session.beginTransaction();

			// 给实体赋值
			MyClass class1 = new MyClass();
			class1.setName("09001");
			
			Student st1 = new Student("aaa");
			Student st2 = new Student("bbb");
			Student st3 = new Student("ccc");
			HashSet<Student> students = new HashSet<Student>();
			students.add(st1);
			students.add(st2);
			students.add(st3);
			
			class1.setStudents(students);
			
			session.save(class1);
			
	

			// 提交事务
			tx.commit();

		} catch (Exception e) {
			// 打印堆栈信息
			e.printStackTrace();
			// 事务回滚
			if (tx != null) {
				tx.rollback();
			}
		}
	}

}
 由于配置了级联关系,Hibernate在插入班级数据(一方)时,会把它所关联的学生数据(多方)也保存到数据库中。
缺点:对象之间的关联关系由一方来维护,在插入一方数据时会更新多方的与这个“一”的对象有关联的对象。导致频繁访问数据库。
测试时,控制台输出的sql语句:
Hibernate: 
    insert 
    into
        class
        (name) 
    values
        (?)
Hibernate: 
    insert 
    into
        student
        (name, class_id) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        student
        (name, class_id) 
    values
        (?, ?)
Hibernate: 
    insert 
    into
        student
        (name, class_id) 
    values
        (?, ?)
Hibernate: 
    update
        student 
    set
        class_id=? 
    where
        id=?
Hibernate: 
    update
        student 
    set
        class_id=? 
    where
        id=?
Hibernate: 
    update
        student 
    set
        class_id=? 
    where
        id=?
 
 
  • 大小: 18.6 KB
分享到:
评论

相关推荐

    Hibernate单向一对多关联映射(XML版)

    在本主题"Hibernate单向一对多关联映射(XML版)"中,我们将深入探讨如何使用XML配置来实现数据库中一个实体类对应多个实体类的关联关系。 在Hibernate中,一对多关联是一种常见的关系映射类型,它反映了数据库中的...

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

    在Java的持久化框架Hibernate中,单向一对多关联映射是常见的数据关系处理方式,尤其是在处理数据库中的实体类和表之间的关系时。本主题主要关注如何使用注解来实现这种映射。Hibernate通过注解使得对象关系映射...

    hibernate 单向多对多关联映射练习

    以上就是关于Hibernate单向多对多关联映射的基本介绍和实践。实际应用中,还需考虑性能优化、事务管理、懒加载等问题。通过不断的练习和学习,你可以更熟练地掌握这一重要功能,提升项目开发的效率和质量。

    hibernate多对一单向关联关系实现源码

    以上就是关于Hibernate中实现多对一单向关联关系的基本知识,包括如何在实体类中定义关联、如何进行数据库操作以及如何查询关联对象。这个源代码示例应该提供了更具体的实现细节,你可以通过查看和运行它来深入理解...

    Hibernate学习:单向多对一关联 工程

    本项目“Hibernate学习:单向多对一关联 工程”专注于讲解Hibernate中的单向多对一关联映射,这是数据库设计中常见的关系类型,尤其在处理具有层次结构的数据时。 单向多对一关联指的是在一个实体类中有一个引用,...

    Hibernate基于外键的一对多单向关联

    4. **单向关联**:在Hibernate的一对多关联中,如果只有“多”的一方知道“一”的存在,而“一”的一方无法直接访问“多”,就称为单向关联。 5. **映射方式**:映射一对多关联可以通过XML配置文件(hibernate.cfg....

    Hibernate双向一对一关联映射(注解版)

    单向一对一映射通常涉及一个实体持有另一个实体的引用,而双向一对一映射则意味着两个实体都可以互相引用。这种关联关系在数据库层面通常通过主键外键约束来实现,但在代码层面则通过注解来表达。 首先,我们需要...

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

    这篇博客文章“hibernate一对多关联映射(单向关联)”将深入讲解如何配置和使用这种映射关系。 在单向关联中,只有一个实体知道另一个实体的存在,也就是说,只有父实体("一"的一端)有对子实体("多"的一端)的...

    hibernate单向多对多映射(XML版)

    在关系型数据库中,两个表之间可能存在多对多关联,意味着一个表中的记录可以对应另一表中的多个记录,反之亦然。例如,学生和课程的关系,一个学生可以选修多门课程,而一门课程也可以被多个学生选修。 在...

    Hibernate 系列教程 单向一对多

    本教程聚焦于Hibernate中的单向一对多关联映射,这是一个常见的实体关系模型,广泛应用于各种业务场景。 在数据库设计中,一对多关系意味着一个父表记录可以与多个子表记录相关联。例如,一个学生可以有多个课程,...

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

    在数据库设计中,一对多关联是指一个表中的记录可以对应另一个表中的多个记录,例如,一个部门可以有多个员工。在这个场景中,我们将探讨如何使用Hibernate来实现这种关系。 首先,我们来看“连接表”的概念。在一...

    Hibernate一对多单向关联映射

    在关系数据库中,一对多关联意味着一个表中的记录可以对应另一个表中的多个记录。例如,一个班级可以有多个学生,而每个学生只属于一个班级。在Hibernate中,我们可以通过配置XML映射文件或使用注解来实现这种关联。...

    Hibernate单向关联代码示例

    这里我们先讨论单向一对多关联,它是最常见的关联类型之一,一个实体可以拥有多个其他实体实例。例如,一个部门可以有多个员工,但员工并不知道属于哪个部门,这就是单向关联。 **单向一对多关联配置:** 1. **...

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

    本主题将主要聚焦在一对一和一对多关联。 2. **关联的方向性:** 关联可以是单向或双向的。单向关联只能从一个实体访问另一个,而双向关联允许两个实体之间互相访问。 3. **@OneToOne, @OneToMany, @ManyToOne ...

    hibernate单向多对多映射(注解版)

    3. `@JoinColumn`: 定义一对一或一对多关系中的外键字段,这里用在`@JoinTable`中,表示多对多关系的连接表中外键的属性。 在上述代码中,`Student`实体有一个`courses`集合,它包含了与之关联的所有`Course`实体。...

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

    本篇文章将详细讲解如何利用Hibernate的注解实现基于连接表的单向一对多关联。 首先,理解一对多关联:在数据库设计中,一对多关联意味着一个实体(表)可以与多个其他实体(表)相对应。例如,一个学生可以有多个...

    Hibernate 一对多外键单向关联

    这里的`many-to-one`元素表示Address与Person的一对多关联,column属性指定了外键列的名称,class属性指定了Person实体的全限定类名,cascade属性可以指定级联操作。 在实际使用中,可以通过Hibernate的Session接口...

Global site tag (gtag.js) - Google Analytics