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

hibernate开发2--双向1-n关联

阅读更多

开发过程中难免会碰到一对多、多对一的关系,比如一个学生属于一个班级,而一个班级里面有多个学生,一个部门有多个员工等,这种情况就需要用数据库表与表之间的关联关系,如果不用关联关系,维护数据库表格将会变得非常麻烦。下面以多个学生属于一个班级介绍在hibernate中数据库表中1-n的关联关系配置方法。

一、hibernate一对多双向关联映射的方法如下

(1) 一的一端,在set元素中使用key元素来表明需要在对方的表中添加一个外键来指向一的一端

(2) 多的一端,则使用many-to-one元素来映射

二、具体配置实现

(1)建立一的一端的类Classes其代码如下:

package cn.test.Bean;

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

public class Classes {
 private Long id;
 private String name;
 private Set<student> stus = new HashSet<student>();//来保存多个学生对应同一个班级
 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<student> getStus() {
  return stus;
 }

 public void setStus(Set<student> stus) {
  this.stus = stus;
 }
}
Classes.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.Classes" table="classes">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<set name="stus" table="student" inverse="true" cascade="save-update">
 <key column="classId" not-null="true"></key>
<one-to-many class="cn.test.Bean.student"/>
</set>
</class>
</hibernate-mapping>

说明:在上述配置文件set元素中,inverse属性设置为true,表面主外键关键又student来维护,子元素key中,column属性指定student表中引用classes表的外键为classId,与student.hbm.xml文件中的many-to-one元素的column相对应。

(2)建立多的一端student类

package cn.test.Bean;

public class student {
 private long id;
 private String name;
 private Classes classes;//与一的一端联系起来

 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 Classes getClasses() {
  return classes;
 }

 public void setClasses(Classes classes) {
  this.classes = classes;
 }
}
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>
<many-to-one name="classes" class="cn.test.Bean.Classes" cascade="save-update" fetch="select" column="classId" not-null="true">
</many-to-one>
</class>
</hibernate-mapping>

说明:many-to-one中,name属性指定在student类中关联的类的属性为classes,cascade属性指定联级操作为save-update,也就是对类student对象保存或者更新会联级保存到Classes类对象。

(3)编写测试代码,让两个学生的信息同属于同一个班级

package cn.test.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
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.Classes;
import cn.test.Bean.student;
public class TestStudent {
 private SessionFactory sessionFactory;
 @Test
 public void testsave(){
  final StandardServiceRegistry registry = new StandardServiceRegistryBuilder()
  .configure() // configures settings from hibernate.cfg.xml
  .build();
     sessionFactory = new MetadataSources( registry ).buildMetadata().buildSessionFactory();
     Session session =sessionFactory.openSession();
     Classes cl=new Classes();
     student st1=new student();
     student st2=new student();
     st1.setName("小明");
     st2.setName("小红");
      cl.setName("一班");
     st1.setClasses(cl);
     st2.setClasses(cl);
     session.beginTransaction();
     session.save(st1);
     session.save(st2);
     session.getTransaction().commit();
     session.close();
 }

}
运行以后,可以看到在数据库student表中,两个学生的classId的值一样,保存的值为classes表中的id的值。

 

0
0
分享到:
评论

相关推荐

    hibernateORM1-n映射

    在"hibernateORM1-n映射"这个主题中,我们将深入探讨Hibernate中的一对多(1:N)映射关系。 在关系数据库中,一对多关系是指一个表中的记录可以对应另一个表中的多个记录。在Hibernate中,这种关系可以通过配置XML...

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

    `hibernate_many2many_1`和`hibernate_many2many_2`的示例可能会展示如何创建中间表来存储这种关系,通常需要定义两个`@ManyToMany`注解,分别在两个参与关联的实体上,并通过`@JoinTable`来指定关联的表结构。...

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

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

    23-Hibernate数据关联(11、M1、1N、MN)

    本教程将深入探讨Hibernate中的四种主要数据关联:一对一(11)、多对一(M1)、一对多(1N)和多对多(MN)的关系映射。 1. **一对一(11)关联**: 在现实世界中,有些实体间存在一对一的关系,例如一个人只有一...

    hibernate-release-4.1.9.Final.zip

    4. 更强的类型安全:使用JPA 2.1的@NamedEntityGraph,可以在查询时指定加载关联的属性,减少N+1查询问题。 5. 新的API:如SessionFactoryBuilder,提供更灵活的SessionFactory构建方式。 三、主要组件详解 1. ...

    HIbernate关联关系总结

    本篇文章将详细讲解Hibernate的两种单向关联关系:单向1-N关联和单向N-1关联。 1. **单向1-N关联** 在这种关联关系中,一个实体(1端)可以与多个其他实体(N端)相关联。在Hibernate中,通常在1端的实体类中引入...

    Hibernate数据关联技术笔记

    3. 双向关联:在1:1和1:N关联中,可以设置双向关联,即双方都能访问到对方。这需要在两个实体的映射文件中都添加对应的`&lt;one-to-one&gt;`或`&lt;many-to-many&gt;`标签。 4. 集合类型:对于1:N和M:N关联,通常使用`Set`、`...

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

    4. **查询优化**:由于双向多对多关联可能导致N+1查询问题,所以在进行关联查询时,应考虑使用`@Fetch(FetchMode.JOIN)`或`@BatchSize`来优化性能。 5. **级联操作**:通过`cascade`属性可以设置级联操作,比如`...

    Hibernate一对多(多对一)双向关联(annotation/xml)

    总之,理解和熟练运用Hibernate的一对多、多对一以及双向关联,是提升Java企业级应用开发效率的关键。通过注解或XML配置,开发者可以灵活地定义实体间的关联,实现数据的持久化。同时,注意级联操作、懒加载策略等...

    hibernate关联映射

    8. **无连接表的双向N-N关联** Person对象和Address对象之间可能存在多对多关系。配置`&lt;set&gt;`元素,使用`&lt;many-to-many&gt;`标签,如`&lt;set name="addresses"&gt;...&lt;/set&gt;`。在这种情况下,通常会有一个额外的连接表`...

    Hibernate之第3解之-hibernate_hibernate_many2one_1

    当处理大量关联数据时,需要关注N+1查询问题。如果不对关联关系进行合理优化,可能会导致性能瓶颈。使用JOIN查询或子查询可以在一定程度上解决这个问题。 7. **缓存机制**: Hibernate的二级缓存可以帮助提高性能...

    Hibernate开发指南01

    2. **环境配置**:详细阐述如何设置Hibernate开发环境,包括下载Hibernate库、配置项目依赖、创建Hibernate配置文件(hibernate.cfg.xml)以及数据库连接信息。 3. **实体类和映射文件**:讲解如何定义Java实体类,...

    实用JPA开发指南----jpa核心技术(关联关系等的配置高级配置)

    1. **懒加载(Lazy Loading)与急加载(Eager Loading)**: 懒加载是默认行为,只有在真正需要关联对象时才加载,以避免N+1查询问题。急加载则是在获取主实体时立即加载关联实体。 2. **级联操作(Cascading)**: ...

    hibernate-3.2框架

    5. 避免N+1查询问题:通过批量加载关联数据,减少数据库查询次数。 总的来说,Hibernate 3.2框架为Java开发者提供了一个强大的ORM解决方案,简化了数据库操作,提升了开发效率。通过深入理解和熟练应用,开发者可以...

    Hibernate开发指南.pdf

    《Hibernate开发指南》这本书深入浅出地介绍了Hibernate这一强大的Java对象关系映射(ORM)框架。Hibernate是一个开源的、轻量级的框架,它能够极大地简化数据库操作,使得开发者可以专注于业务逻辑,而不是繁琐的...

    Hibernate入门到精通

    - 查询:HQL(Hibernate Query Language)是Hibernate的查询语言,可以避免N+1问题,通过一次性加载所有数据或使用`Criteria` API进行分页查询。 总的来说,Hibernate通过简化数据库操作,提高了开发效率。理解并...

    Hibernate 培训.pdf

    - 对象之间的关系(如 1:n 或 n:m)通过外键或关联表实现。 - 继承关系可以通过单表继承、具体表继承或类表继承等方式实现。 #### 三、Hibernate 核心接口 ##### 3.1 核心接口图 Hibernate 提供了一组核心接口,...

    Hibernate映射关系大全

    2. **有连接表的 N:1 关联** 当关联需要通过额外的连接表(emp_dept)来建立时,使用 `&lt;join&gt;` 标签。配置包括表名、键列(empid 和 deptid)以及级联操作。 3. **无连接表的 1:N (一对多) 单向关联** 在单向关联...

    Hibernate一对多单向关联映射

    1. 在实际开发中,为了防止N+1查询问题,可以使用`JOIN FETCH`来一次性加载所有关联数据。 2. 对于大量数据,考虑使用分页加载或者懒加载策略,以优化性能。 六、注意事项 1. 避免在循环中对集合进行增删改操作,...

Global site tag (gtag.js) - Google Analytics