- 浏览: 377586 次
- 来自: 北京
文章分类
- 全部博客 (237)
- XML (6)
- JavaSE (39)
- Junit (1)
- Maven (10)
- JavaScript (12)
- JavaEE (16)
- HTML5 (10)
- java多线程 (8)
- Hibernate (30)
- Java反射 (3)
- Spring (11)
- Struts (1)
- svn (2)
- linux (12)
- 代码实例 (1)
- 设计模式 (1)
- UML (1)
- javassist (1)
- Oracle (3)
- Hibernate异常 (9)
- DWR (6)
- Java泛型 (2)
- SpringMVC (11)
- Dbunit (3)
- github (2)
- Algorithm (1)
- zTree (1)
- jquery (7)
- freemarker (4)
- mysql (5)
- ffmpeg (1)
- 编码 (1)
- lucene (15)
- hadoop (1)
- JVM (1)
- Regular Expressions (5)
- myeclipse (1)
- 爬虫 (7)
- 加密 (3)
- WebService (2)
- Socket (2)
- Windows (1)
最新评论
-
wxpsjm:
好直接
HV000030: No validator could be found for type: java.lang.Integer. -
wxhhbdx:
学习了,对新手来说很不错的教程。
SpringMVC入门 (二) 数值传递 -
xgcai:
正好在学dwr
DWR入门 (二)用户实例
场景:
Student和Course,每一个Student有多个Course,每一个Course也有多个Student。
类文件如下:
public class Student { private int id; private String name; private Set<Course> courses; } public class Course { private int id; private String name; private Set<Student> students; }
配置文件:
<hibernate-mapping package="many2many"> <class name="Student" table="test_student"> <id name="id" column="id" type="int"> <generator class="assigned"> </generator> </id> <property name="name" column="name" type="string" /> <!-- table是连接表的名字 对于多对多,cascade一定不能设置all,而是要设置save-update. 比如我们要删除某个学生,单并不代表要删除该学生的课程。--> <set name="courses" table="student_course" cascade="save-update"> <!-- 这里的column是指与Student所关联的表的外键 --> <key column="student_id"> </key> <many-to-many class="Course" column="course_id"/> </set> </class> </hibernate-mapping> <hibernate-mapping package="many2many"> <class name="Course" table="test_course"> <id name="id" column="id" type="int"> <generator class="assigned"> </generator> </id> <property name="name" column="name" type="string" /> <!-- table=student_course是两个Entity的关联表,用于负责多对多关联 Hibernate会在数据库生成表student_course,对应的Course的外键是下面配置 的course_id --> <set name="students" table="student_course" cascade="save-update"> <key> <column name="course_id"/> </key> <!-- 这里如果不加入column=course_id,就会生成一个包含elt列的表。 --> <!-- 这里student_id表示对应的student的外键 --> <many-to-many class="Student" column="student_id"/> </set> </class> </hibernate-mapping>
生成SQL代码:
Hibernate: drop table student_course cascade constraints
Hibernate: drop table test_course cascade constraints
Hibernate: drop table test_student cascade constraints
Hibernate: create table student_course (student_id number(10,0) not null, course_id number(10,0) not null, primary key (course_id, student_id))
Hibernate: create table test_course (id number(10,0) not null, name varchar2(255 char), primary key (id))
Hibernate: create table test_student (id number(10,0) not null, name varchar2(255 char), primary key (id))
Hibernate: alter table student_course add constraint FK_8eu2c4tg0i8amuwx6n6d4i8h0 foreign key (course_id) references test_course
Hibernate: alter table student_course add constraint FK_3shg469d7jsf2a81b5x62jlq1 foreign key (student_id) references test_student
插入
Session session=HibernateUtil.openSession(); Transaction tx=session.beginTransaction(); Student s1=new Student(1, "alleni", null); Student s2=new Student(2,"eline",null); Course c1=new Course(1,"English",null); Course c2=new Course(2,"Draw",null); s1.setCourses(ArraysHelper.asSet(c1)); s2.setCourses(ArraysHelper.asSet(c1,c2)); session.save(s1); session.save(s2); tx.commit();
运行之后会执行:
Hibernate: select course_.id, course_.name as name2_1_ from test_course course_ where course_.id=?
Hibernate: select course_.id, course_.name as name2_1_ from test_course course_ where course_.id=?
Hibernate: insert into test_student (name, id) values (?, ?)
Hibernate: insert into test_course (name, id) values (?, ?)
Hibernate: insert into test_student (name, id) values (?, ?)
Hibernate: insert into test_course (name, id) values (?, ?)
Hibernate: insert into student_course (student_id, course_id) values (?, ?)
Hibernate: insert into student_course (student_id, course_id) values (?, ?)
Hibernate: insert into student_course (student_id, course_id) values (?, ?)
结果为:
修改
修改的时候要注意<set>元素中的inverse属性.
inverse表示是否由对方来维持中间表。
更详细的说明在:
http://www.cnblogs.com/mabaishui/archive/2009/10/19/1585843.html
这里假如我们设置Student的<set>的inverse为true, 那么当我们使用
student.setCourses(c1,c2)
这样的代码, 是不能对student_course表产生作用的。
也就是说Student不能对many-to-many关联表产生作用。
只有Course才可以。
inverse=true相当于使该对象放弃了对关联表的操作功能。many-to-many默认下inverse=false,相当于双方都可以对关联表进行维护操作
-如果两边都设置为true, 那这个关联表student_course就永远不会得到任何相关操作。
Session session=HibernateUtil.openSession(); Transaction tx=session.beginTransaction(); Student s1=new Student(1, "alleni", null); Student s2=new Student(2,"eline",null); Course c1=new Course(1,"English",null); Course c2=new Course(2,"Draw",null); // s1.setCourses(ArraysHelper.asSet(c1)); // s2.setCourses(ArraysHelper.asSet(c1,c2)); // session.update(s1); // session.update(s2); // tx.commit(); //当Student.inverse=false,Course.inverse=true,使用如上操作。 c1.setStudents(ArraysHelper.asSet(s1,s2)); c2.setStudents(ArraysHelper.asSet(s2)); session.update(c1); session.update(c2); tx.commit(); //当Student.inverse=true,Course.inverse=false,使用如上操作. //默认inverse都是false,所以默认情况下上面两种操作都可以。
查询
Session session=HibernateUtil.openSession(); Student s=(Student) session.load(Student.class, 2); for(Course c:s.getCourses()){ System.out.println(c.getName()); }
这里查询id为2的学生的所有课程名称。
该查询执行SQL语句为:
Hibernate: select student0_.id as id1_2_0_, student0_.name as name2_2_0_ from test_student student0_ where student0_.id=?
Hibernate: select courses0_.student_id as student1_2_1_, courses0_.course_id as course2_0_1_, course1_.id as id1_1_0_, course1_.name as name2_1_0_ from student_course courses0_ inner join test_course course1_ on courses0_.course_id=course1_.id where courses0_.student_id=?
第二条是inner join语句, 整理一下就是:
select sc.student_id as student1, sc.course_id as course1, tc.id as tc_id, tc.name as tc_name from student_course sc inner join test_course tc on sc.course_id=tc.id where sc.student_id=?
由于Hibernate的SQL别名起的有点乱, 我就改了一下。
上面的语句中, student_course ->sc
test_course ->tc
也就是说, Hibernate对关联表和Course表进行了join查询。
最终从Course表获取所有包含关联表student_course中所包含的查询学生的id所对应的Course.
(student_course表中查询该学生id的row->获取对应的course_id->到course表中查询对应id的row)
发表评论
-
Connection is read-only. Queries leading to data modification are not allowed。
2014-04-06 21:52 3737<tx:advice id="txAdvic ... -
org.hibernate.HibernateException: No Session found for current thread
2014-04-06 12:37 0今天在maven中整合spring和hibernate,并使用 ... -
select new Topic from ' Mysql 生成SQL语句错误
2014-03-30 22:51 1661Caused by: com.mysql.jdbc.exce ... -
Unable to locate appropriate constructor on class
2014-02-20 00:11 1467org.hibernate.hql.internal.ast. ... -
Hibernate的load和get实际应用区分简单实例
2013-12-18 11:58 876今天在看孔浩的CMS视频时候看到的。 在57 -文章管理06 ... -
自定义OpenSessionInViewer过滤器
2013-12-11 12:12 1059摘自孔浩视频 spring部分-17_spring_SSH整合 ... -
数据库事务 (三)虚读(Phantom Read)
2013-12-01 13:21 0关于各种读 虚读 phantom read: 转自维基 ... -
Hibernate悲观锁
2013-11-30 17:30 0为了防止两个线程同时修改一个数据,造成更新数据丢失,我们可以使 ... -
Hibernate查询HQL实例
2013-11-29 15:56 1295三个实体类对象: public class Team { ... -
QBC与HQL检索
2013-11-28 17:39 0QBC(Query By Criteria) API提供了检索 ... -
Hibernate继承映射
2013-11-28 12:36 653继承映射分为三种情况 1.每个子类一张表 比如说有一个Pers ... -
Hibernate通过Composite-element配置外联表实例 (码)
2013-11-28 11:07 1022摘自圣思园Hibenrate 26. 组件映射深度解析 -37 ... -
Hibernate配置复合主键 composite primary key (二)
2013-11-27 16:41 1450摘自圣思园Hibernate 26.组件映射深度解析 上一篇 ... -
Hibernate配置复合主键 composite primary key (一)
2013-11-27 14:15 2456这篇是关于如何配置Hibernate实现复合主键的映射功能。 ... -
Hibernate通过Comparator接口自定义排序规则
2013-11-25 20:42 2528摘自圣思园 Hibernate25.自定义内存排序器详解及符合 ... -
Hibernate配置Set和List
2013-11-25 10:44 1885========================Set==== ... -
Hibernate的Map配置
2013-11-23 16:21 1300摘自圣思园022.Hibernate映 ... -
Hibernate延迟加载案例 (多: 一: 一,附代码)
2013-11-21 17:41 594摘自圣思园Hibernate20.一 ... -
Hibernate一对一配置
2013-11-20 21:49 1050摘自圣思园 19.Hibernate的对象检索策略深度解析.a ... -
Hibernate的对象检索策略 (一) SQL左外连接检索策略
2013-11-20 15:32 1141首先是测试表的结构: 先通过hibernate将数据放入 ...
相关推荐
在 Hibernate 中配置多数据库,并自由切换,可以使用 Spring 框架来实现。下面是一个简单的配置示例: 首先,创建一个父数据源(parentDataSource),用于配置多个数据源共有的信息: ```xml ...
Hibernate配置文件hibernate.cfg.xml中配置信息详解!
Hibernate 配置文件详解 Hibernate 是一个流行的 ORM(Object-Relational Mapping)框架,用于简化 Java 应用程序中的数据库交互。 Hibernate 的配置文件是其核心组件之一,用于定义 Hibernate 的运行期参数。下面...
这里我们将深入探讨 Hibernate 的一对多关系、配置以及在实际项目中的应用。 首先,一对多关系在数据库中很常见,例如一个用户可以有多个订单,一个班级可以有多名学生等。在Hibernate中,这种关系通过在实体类和...
在本篇中,我们将深入探讨Hibernate的配置,特别是涉及一对一、一对多和多对多关系的配置。 首先,配置过程始于`Configuration`接口。这个接口用于设置Hibernate所需的配置信息,如数据源、连接参数等,并根据配置...
总结,这个示例展示了如何在Spring Boot 2.0中配置多数据源,使用Hibernate作为ORM工具,以及如何在DAO层通过`HibernateDaoSupport`进行数据操作,并在业务逻辑中灵活地切换数据源。这有助于实现更复杂的数据库访问...
### Hibernate配置参数详解 #### 一、数据库连接配置(JDBC) 在Hibernate中,与数据库交互的第一步就是正确地配置数据库连接。以下是一些关键的配置参数及其含义: 1. **`hibernate.connection.driver_class`**...
本文将深入探讨Hibernate中的多对一映射关联配置,并结合具体的文档心得进行讲解。 首先,我们要了解多对一映射的基本概念。在数据库设计中,如果一个表(实体A)的某一列是另一个表(实体B)的主键,那么就存在...
通过这个实例,你将掌握在Java项目中使用Hibernate的基本流程,无论是普通Java工程还是Maven工程,都能轻松实现对数据库的操作。在实际开发中,你可以根据项目需求进一步优化配置,比如加入事务管理、查询优化等,以...
`hibernate1.cfg.xml`是Hibernate配置的核心文件,它定义了数据源、连接池、持久化类、缓存策略等关键信息。以下将逐个解析这些重要部分。 1. 数据源配置: 在`hibernate1.cfg.xml`中,首先需要配置数据源。对于...
总结来说,"Hibernate多对多"涉及到Java ORM框架Hibernate处理两个实体类之间的多对多关系的技术,在MyEclipse环境下进行开发,提供了从设计实体类、配置映射到实现业务逻辑的全套解决方案。通过提供的压缩包文件,...
**Hibernate基本配置演示** 在Java开发中,Hibernate是一款强大的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者能够用Java对象来处理数据。这篇教程将深入讲解Hibernate的基本配置过程,确保你能顺利...
4. **实体映射**:配置文件中通常还会包含对Java实体类的映射信息。通过`<mapping resource="entity/EntityName.hbm.xml"/>`来指定每个实体类的映射文件,这些文件描述了Java对象与数据库表之间的映射关系。 5. **...
3. 创建Hibernate配置文件。通常该文件命名为hibernate.cfg.xml,并放置在项目的src目录下。配置文件中需要声明以下关键内容: - 数据库方言(Dialect):指定Hibernate针对哪种数据库优化其SQL语句。 - 连接...
在实际开发中,`hibernate.cfg.xml`可能会包含更多特定的配置,如日志设置、数据库版本控制等。开发者可以根据项目需求对其进行调整。下载提供的`hibernate.cfg.xml`文件,可以作为参考模板,根据自己的数据库和应用...
本文介绍了如何利用反射机制来修改Hibernate配置文件中的数据库连接信息,并通过自定义`ConnectionProvider`实现了对敏感信息的加密处理。这种做法不仅增强了应用程序的安全性,还提高了配置信息的管理效率。开发者...
在Hibernate中,配置多对多映射通常需要以下几个步骤: 1. **实体类定义**:为每个实体创建对应的Java类,并使用`@Entity`注解标记。 2. **关系属性**:在两个实体类中,分别定义一个表示多对多关系的集合属性,如`...
Hibernate连接SQLite配置步骤: 1、添加SQLite库: 1.1、将两个jar包:com.zy.hibernate.dialect.SQLiteDialect.jar、sqlite-jdbc-3.7.2.jar拷贝到“\WEB-INF\lib”文件夹下; 2、配置hibernate: 2.1、将...
hibernate配置文件 里面提供了连接数据库 数据库使用的方言 是否打印SQL语句 sql语句的格式 以及对象-关系映射文件的地址等