开发过程中难免会碰到一对多、多对一的关系,比如一个学生属于一个班级,而一个班级里面有多个学生,一个部门有多个员工等,这种情况就需要用数据库表与表之间的关联关系,如果不用关联关系,维护数据库表格将会变得非常麻烦。下面以多个学生属于一个班级介绍在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的值。
相关推荐
在"hibernateORM1-n映射"这个主题中,我们将深入探讨Hibernate中的一对多(1:N)映射关系。 在关系数据库中,一对多关系是指一个表中的记录可以对应另一个表中的多个记录。在Hibernate中,这种关系可以通过配置XML...
`hibernate_many2many_1`和`hibernate_many2many_2`的示例可能会展示如何创建中间表来存储这种关系,通常需要定义两个`@ManyToMany`注解,分别在两个参与关联的实体上,并通过`@JoinTable`来指定关联的表结构。...
总结来说,Hibernate中的双向关联映射是对象关系映射的重要组成部分,包括双向多对多、双向一对多和双向一对一。理解并熟练运用这些映射方式,有助于开发者更好地实现Java应用程序与数据库间的交互,提高开发效率和...
本教程将深入探讨Hibernate中的四种主要数据关联:一对一(11)、多对一(M1)、一对多(1N)和多对多(MN)的关系映射。 1. **一对一(11)关联**: 在现实世界中,有些实体间存在一对一的关系,例如一个人只有一...
4. 更强的类型安全:使用JPA 2.1的@NamedEntityGraph,可以在查询时指定加载关联的属性,减少N+1查询问题。 5. 新的API:如SessionFactoryBuilder,提供更灵活的SessionFactory构建方式。 三、主要组件详解 1. ...
本篇文章将详细讲解Hibernate的两种单向关联关系:单向1-N关联和单向N-1关联。 1. **单向1-N关联** 在这种关联关系中,一个实体(1端)可以与多个其他实体(N端)相关联。在Hibernate中,通常在1端的实体类中引入...
3. 双向关联:在1:1和1:N关联中,可以设置双向关联,即双方都能访问到对方。这需要在两个实体的映射文件中都添加对应的`<one-to-one>`或`<many-to-many>`标签。 4. 集合类型:对于1:N和M:N关联,通常使用`Set`、`...
4. **查询优化**:由于双向多对多关联可能导致N+1查询问题,所以在进行关联查询时,应考虑使用`@Fetch(FetchMode.JOIN)`或`@BatchSize`来优化性能。 5. **级联操作**:通过`cascade`属性可以设置级联操作,比如`...
总之,理解和熟练运用Hibernate的一对多、多对一以及双向关联,是提升Java企业级应用开发效率的关键。通过注解或XML配置,开发者可以灵活地定义实体间的关联,实现数据的持久化。同时,注意级联操作、懒加载策略等...
8. **无连接表的双向N-N关联** Person对象和Address对象之间可能存在多对多关系。配置`<set>`元素,使用`<many-to-many>`标签,如`<set name="addresses">...</set>`。在这种情况下,通常会有一个额外的连接表`...
当处理大量关联数据时,需要关注N+1查询问题。如果不对关联关系进行合理优化,可能会导致性能瓶颈。使用JOIN查询或子查询可以在一定程度上解决这个问题。 7. **缓存机制**: Hibernate的二级缓存可以帮助提高性能...
2. **环境配置**:详细阐述如何设置Hibernate开发环境,包括下载Hibernate库、配置项目依赖、创建Hibernate配置文件(hibernate.cfg.xml)以及数据库连接信息。 3. **实体类和映射文件**:讲解如何定义Java实体类,...
1. **懒加载(Lazy Loading)与急加载(Eager Loading)**: 懒加载是默认行为,只有在真正需要关联对象时才加载,以避免N+1查询问题。急加载则是在获取主实体时立即加载关联实体。 2. **级联操作(Cascading)**: ...
5. 避免N+1查询问题:通过批量加载关联数据,减少数据库查询次数。 总的来说,Hibernate 3.2框架为Java开发者提供了一个强大的ORM解决方案,简化了数据库操作,提升了开发效率。通过深入理解和熟练应用,开发者可以...
《Hibernate开发指南》这本书深入浅出地介绍了Hibernate这一强大的Java对象关系映射(ORM)框架。Hibernate是一个开源的、轻量级的框架,它能够极大地简化数据库操作,使得开发者可以专注于业务逻辑,而不是繁琐的...
- 查询:HQL(Hibernate Query Language)是Hibernate的查询语言,可以避免N+1问题,通过一次性加载所有数据或使用`Criteria` API进行分页查询。 总的来说,Hibernate通过简化数据库操作,提高了开发效率。理解并...
- 对象之间的关系(如 1:n 或 n:m)通过外键或关联表实现。 - 继承关系可以通过单表继承、具体表继承或类表继承等方式实现。 #### 三、Hibernate 核心接口 ##### 3.1 核心接口图 Hibernate 提供了一组核心接口,...
2. **有连接表的 N:1 关联** 当关联需要通过额外的连接表(emp_dept)来建立时,使用 `<join>` 标签。配置包括表名、键列(empid 和 deptid)以及级联操作。 3. **无连接表的 1:N (一对多) 单向关联** 在单向关联...
1. 在实际开发中,为了防止N+1查询问题,可以使用`JOIN FETCH`来一次性加载所有关联数据。 2. 对于大量数据,考虑使用分页加载或者懒加载策略,以优化性能。 六、注意事项 1. 避免在循环中对集合进行增删改操作,...