前面已经对Hibernate有了基本的了解,下面说一下Hibernate的各种映射
映射关系包含四种
①一对多 one-to-many
②多对一 many-to-one
③一对一 one-to-one
④多对多 many-to-many
这个里面还区别单向和双向
单向一对多映射
实现核心:在one方持有many方的集合
一个班级包含多个学生,在班级中添加学生的集合List集/Set集
班级是一方,学生是多方
下面以http://sunyuqian.iteye.com/blog/2248913中实例为基础来实现一个单向一对多实例
1.hibernate.cfg.xml
在基础(一)的blog中已经对各个属性进行了说明,在此不赘述。
注意一点是:使用到了getCurrentSession(),所以添加了"hibernate.current_session_context_class"配置
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- oracle数据库驱动 -->
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<!-- oracle想要连接的数据库名称 -->
<property name="connection.url">jdbc:oracle:thin:@10.1.0.169:1521:orcl</property>
<!-- 数据库的登陆用户名 -->
<property name="connection.username">SUNYQ</property>
<!-- 数据库的登陆密码 -->
<property name="connection.password">123456</property>
<!-- 方言:为每一种数据库提供适配器,方便转换 -->
<property name="hibernate.dialect">org.hibernate.dialect.Oracle9iDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hbm2ddl">create</property>
<mapping resource="Students.hbm.xml"/>
<mapping resource="Grade.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>
2.创建持久化实体类
也可在数据库中事先创建出来学生表和班级表,也可以通过配置文件来设置,方式根据需求来定,本文使用配置文件来生成数据库表。
Students类:
package com.iteye.sunyq.hibernate;
public class Students {
public Students() {
}
private int sid;
private String sname;
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;
}
public Students(String sname) {
super();
this.sname = sname;
}
}
Grade类
package com.iteye.sunyq.hibernate;
import java.util.HashSet;
import java.util.Set;
public class Grade {
public Grade(){
}
private int gid;
private String gname;
private String gdesc;
private Set<Students> studentSet = new HashSet<Students>();
public int getGid() {
return gid;
}
public void setGid(int gid) {
this.gid = gid;
}
public String getGname() {
return gname;
}
public void setGname(String gname) {
this.gname = gname;
}
public String getGdesc() {
return gdesc;
}
public void setGdesc(String gdesc) {
this.gdesc = gdesc;
}
public Set<Students> getStudentSet() {
return studentSet;
}
public void setStudentSet(Set<Students> studentSet) {
this.studentSet = studentSet;
}
public Grade(String gname, String gdesc) {
super();
this.gname = gname;
this.gdesc = gdesc;
}
}
注意:根据一对多映射关系的实现原理-》是在一方持有多方的集合,也就是在Grade.java中包含Students.java的集合。
private Set<Students> studentSet = new HashSet<Students>();
那么通过这种方式生成的表结构是什么样的呢?提前看一下
grade表:
students表:
students表中外键gid:
所以,通过持久化类中包含students集合实际就是students表与grade表gid进行了外键的关联
3.映射文件
Students.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="com.iteye.sunyq.hibernate.Students" table="students">
<id name="sid" type="integer">
<column name="id"></column>
<generator class="native"></generator>
</id>
<property name="sname" type="string">
<column name="sname"></column>
</property>
</class>
</hibernate-mapping>
Grade.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="com.iteye.sunyq.hibernate.Grade" table="grade">
<id name="gid" type="integer">
<column name="id"></column>
<generator class="native"></generator>
</id>
<property name="gname" type="string">
<column name="gname"></column>
</property>
<property name="gdesc" >
<column name="gdesc"></column>
</property>
<set name="studentSet">
<key column="gid"/>
<one-to-many class="com.iteye.sunyq.hibernate.Students"></one-to-many>
</set>
</class>
</hibernate-mapping>
注意:
①首先在Students表中的外键gid是不需要写到Students.hbm.xml中的,这个外键是在一方进行维护,就是Grade.hbm.xml中进行维护
②Grade.hbm.xml中外键gid是写在<set>标签中的
<set name="studentSet">
<key column="gid"/><!-- Students表中外鍵名称 -->
<one-to-many class="com.iteye.sunyq.hibernate.Students"></one-to-many><!-- 映射的实体类 -->
</set>
4.Hibernate工具类
对Hibernate的链接数据库抽象到一个工具类中
package com.iteye.sunyq.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
public class HibernateUtil {
private static SessionFactory sessionFactory;
private static Session session;
static{
Configuration config = new Configuration().configure();
ServiceRegistry service = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
sessionFactory = config.buildSessionFactory(service);
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
public static Session getSession(){
session = sessionFactory.openSession();
return session;
}
public static void closeSession(Session session){
if(session != null)
session.close();
}
}
5.测试:增删改查
注意:通过配置文件建立关联关系之后,可以比较方便的根据一来导航到多的对象
但是,反过来是不可以的,因为是单向的。也就是说可以通过班级来对学生进行一定的操作,而是用学生却不能对班级进行相应的操作。
举例:可以通过班级来查询到该班级下的所有学生对象的信息,而只去查询学生,并不能查询到班级对象的信息。
package com.iteye.sunyq.hibernate;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
public class Test {
public static void main(String[] args) {
addStudent();
findStudent();
deleteStudent();
update();
}
public static void addStudent(){
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
Grade grade = new Grade("班级二","班级二描述");
Students student1 = new Students("王五");
grade.getStudentSet().add(student1);
session.save(grade);
session.save(student1);
transaction.commit();
HibernateUtil.closeSession(session);
}
public static void findStudent(){
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
Grade grade = (Grade) session.get(Grade.class, 1);
System.out.println("班级:"+grade.getGid()+","+grade.getGname()+","+grade.getGdesc());
Set<Students> students = grade.getStudentSet();
for(Students info : students){
System.out.println("学生:"+info.getSid()+""+info.getSname());
}
//注意:因为是单向映射,我们不能通过student的信息来获取到grade信息。
Students s = (Students)session.get(Students.class, 2);
System.out.println("查询学生信息:"+s.getSid()+"-"+s.getSname());
transaction.commit();
HibernateUtil.closeSession(session);
}
public static void deleteStudent(){
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
Students student = (Students)session.get(Students.class, 9);
session.delete(student);
transaction.commit();
}
public static void update(){
Session session = HibernateUtil.getSession();
Transaction transaction = session.beginTransaction();
Grade grade = (Grade) session.get(Grade.class, 8);
Students student = (Students) session.get(Students.class, 9);
student.setSname("哈哈");
grade.getStudentSet().add(student);
session.save(grade);
transaction.commit();
HibernateUtil.closeSession(session);
}
}
- 大小: 41.3 KB
- 大小: 32.6 KB
- 大小: 31.7 KB
- 大小: 19.1 KB
分享到:
相关推荐
总之,Hibernate的多对多关联映射是解决复杂关系数据库设计的关键技术之一。通过合理的配置和使用,开发者可以轻松管理实体之间的多对多关系,提高开发效率。理解并熟练掌握这部分知识对于提升Java企业级应用开发...
三、配置多对多映射 在Hibernate中,配置多对多映射通常需要以下几个步骤: 1. **实体类定义**:为每个实体创建对应的Java类,并使用`@Entity`注解标记。 2. **关系属性**:在两个实体类中,分别定义一个表示多对多...
包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。
1. Hibernate 是一种开源的持久层框架,提供了一个高效的数据访问机制,能够将 Java 对象与数据库表进行映射。 2. MyEclipse 是一个集成开发环境(IDE),提供了丰富的开发工具和插件,包括数据库管理、代码编辑、...
本文将深入探讨 Hibernate 中的一对一映射关系,并以"hibernate 映射关系学习入门 一对一映射Eclipse源码"为主题,详细解析其概念、配置以及实际应用。 一对一映射是Hibernate中的一种关联关系,它表示两个实体之间...
在这个“hibernate学习入门之一对多实体映射源码”教程中,我们将深入探讨如何在Hibernate中设置和管理一对多的关系。 一、Hibernate简介 Hibernate是Java开发人员用于处理数据库操作的强大工具,通过它,我们可以...
本文将深入探讨Hibernate中的一对多和多对一映射关系,并通过一个实际的demo演示它们在增删查改操作中的应用。 首先,我们要理解什么是数据库的关联关系。在数据库设计中,我们经常遇到一种情况,即一个实体可能与...
hibernate映射文件是Java开发中用于对象关系映射(ORM)的重要组成部分,它将数据库表与Java类之间的关系进行定义,使得开发者无需编写大量的SQL语句,就能实现对数据库的操作。`生成hibernate映射文件工具`是为了...
在本章中,我们将深入探讨Hibernate中的关联映射,包括一对多、多对一以及多对多的关系。这些映射关系对于理解如何在Java应用程序中有效地管理数据库对象至关重要。 首先,我们来解决描述中提到的问题。`...
4. **关联(Associations)**:实体之间的关系,如一对一、一对多、多对多等。 5. **继承(Inheritance)**:支持类的继承结构,如单表继承或多表继承。 自动化的映射文件生成通常涉及以下步骤: 1. **分析Java类**...
**hibernate映射与查询** Hibernate 是一个流行的 Java 应用程序开发框架,它提供了一个持久层解决方案,简化了数据库操作。对于初学者来说,理解 Hibernate 的映射和查询机制是至关重要的,因为它们构成了 ...
### 三、多对一映射 多对一关系是另一个表的多行可以对应到同一个表的一行。在Hibernate中,实现多对一映射的方法与一对多类似,只是在实体类的定义上有所区别: 1. **配置文件映射**:同样需要在配置文件中声明两...
本篇文章将深入探讨Hibernate中的一对多和多对多关系映射。 首先,让我们理解一对多关联映射。在数据库中,一对多关系意味着一个表中的记录可以与另一个表中的多个记录相关联。在Hibernate中,这可以通过在实体类中...
而MyEclipse作为一款强大的Java集成开发环境,提供了对Hibernate的良好支持,包括自动生成Hibernate映射文件的功能。本文将详细介绍如何在MyEclipse中创建和使用Hibernate映射文件。 首先,理解Hibernate映射文件...
- `<one-to-one>`、`<many-to-one>`、`<one-to-many>`和`<many-to-many>`:分别用于一对一、一对多、多对一和多对多的关系映射,通过`<class>`元素的嵌套和属性如`inverse`、`cascade`等来控制关系的维护方式和级联...
在Hibernate中,实现多对多映射通常涉及三个元素:实体类、关联表(也称为中间表)以及XML映射文件。实体类代表数据库中的表,而关联表则用于存储双方实体的关联关系。XML映射文件是 Hibernate 了解这些实体及其关系...
而MyEclipse作为一款集成开发环境,提供了对Hibernate的全面支持,包括自动生成Hibernate的映射文件。这个功能使得开发者能够快速地将数据库表结构转化为Java实体类和对应的配置文件,大大提高了开发效率。 1. **...
本实例主要探讨了Hibernate中的三种基本映射关系:一对一、一对多以及多对多,并且是基于SQL Server数据库进行实现的。以下是这些映射关系的详细解释: ### 一对一映射 一对一映射通常发生在两个实体之间存在唯一...
`hibernate-mapping`节点是Hibernate映射文件中的顶级节点,用于定义一系列配置选项,控制整个映射文件的行为和映射规则。这些配置包括数据库连接细节、默认的映射策略等。 - **schema**: 定义了数据库的Schema名称...