- 浏览: 115173 次
- 性别:
- 来自: 上海
文章分类
最新评论
一对多关联映射(one-to-many)
一对多关联映射利用了多对一关联映射原理
* 多对一关联映射:在多的一端加和一个外键指向一的一端,它维护的关系是多指向一的
* 一对多关联映射:在一的一端加和一个外键指向多的一端,它维护的关系是一指向多的
也就是说一对多和多对一的映射策略是一样的,只是站的角度不同,一般都作成双项的
------------------------------------------------------------------------------
1 一对多关联映射(单项Classes--->Student)
在一一端维护关系的缺点:
* 如果将t_student表里的classesid这段设置为非空,则无法保存
* 因为不在student这一端维护关系,所以student不知道是哪个班的
所以需要发出多余的update语句来更新关系
多对多关联映射(单项User---->Role)
<many-to-many/>标签
<set>标签中加入属性table="t_user_role"创建关联表
一对多关联映射利用了多对一关联映射原理
* 多对一关联映射:在多的一端加和一个外键指向一的一端,它维护的关系是多指向一的
* 一对多关联映射:在一的一端加和一个外键指向多的一端,它维护的关系是一指向多的
也就是说一对多和多对一的映射策略是一样的,只是站的角度不同,一般都作成双项的
------------------------------------------------------------------------------
1 一对多关联映射(单项Classes--->Student)
在一一端维护关系的缺点:
* 如果将t_student表里的classesid这段设置为非空,则无法保存
* 因为不在student这一端维护关系,所以student不知道是哪个班的
所以需要发出多余的update语句来更新关系
<!--
Classes: Student:
private int id; private int id;
private String name; private String name;
private Set students;//必须用Set
-->
<class name="com.my.hibernate.Student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
<class name="Classes">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students">
<key column="classesid"/>
<one-to-many class="Student"/>
</set>
</class>
Classes: Student:
private int id; private int id;
private String name; private String name;
private Set students;//必须用Set
-->
<class name="com.my.hibernate.Student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
<class name="Classes">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students">
<key column="classesid"/>
<one-to-many class="Student"/>
</set>
</class>
public void testSave1(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
Student student1=new Student();
student1.setName("10");
session.save(student1);//先进行save操作
Student student2=new Student();
student2.setName("祖儿");
session.save(student2);//先进行save操作
Set students=new HashSet();
students.add(student1);
students.add(student2);
Classes classes=new Classes();
classes.setName("尚学堂");
classes.setStudents(students);
session.save(classes);
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}
public void testLoad1(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
Classes classes=(Classes)session.load(Classes.class, 3);
System.out.println(classes.getName());
Set students=classes.getStudents();
for(Iterator iter=students.iterator();iter.hasNext();){
Student student=(Student)iter.next();
System.out.print(student.getName()+";");
}
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
Student student1=new Student();
student1.setName("10");
session.save(student1);//先进行save操作
Student student2=new Student();
student2.setName("祖儿");
session.save(student2);//先进行save操作
Set students=new HashSet();
students.add(student1);
students.add(student2);
Classes classes=new Classes();
classes.setName("尚学堂");
classes.setStudents(students);
session.save(classes);
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}
public void testLoad1(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
Classes classes=(Classes)session.load(Classes.class, 3);
System.out.println(classes.getName());
Set students=classes.getStudents();
for(Iterator iter=students.iterator();iter.hasNext();){
Student student=(Student)iter.next();
System.out.print(student.getName()+";");
}
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}
2 一对多关联映射(双项Classes<--->Student)
一对多双向关联映射:
* 在一一端的集合上用<key>,在对方表中加入一个外键指向一的一端
* 在多的一端采用<many-to-one>
注意:<key>标签指定的外键字段必须和<many-to-one>指定的外键字段一致,否则引用字段错误
如果在一的一端维护一对多关联关系,hibernate会发出多余的update语句,所以我们一般在多的一端来维护关联关系
关于inverse属性:
inverse主要用在一对多和多对多双向关联上,inverse可以被设置到集合标签<set>上,
默认inverse为 false,所以我们可以从一的一端和多的一端维护关联关系,
如果设inverse为true,则我们只能从多的一端来维护关联关系
注意:inverse属性,只影响数据的存储,也就是持久化。
inverse和cascade:
* inverse是关联关系的控制方向
* cascade是操作上的连锁反应
<!--
Classes: Student:
private int id; private int id;
private String name; private String name;
private Set students;//必须用 Set private Classes classes;
-->
<class name="Classes">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students" inverse="true" cascade="all">
//cascade属性:none 不及连 save-update 插入或更新及连 delete删除及连 all
<key column="classesid"/>
<one-to-many class="Student"/>
</set>
</class>
<class name="com.my.hibernate.Student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="classes" column="classesid" cascade="save-update"/>
</class>
Classes: Student:
private int id; private int id;
private String name; private String name;
private Set students;//必须用 Set private Classes classes;
-->
<class name="Classes">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="students" inverse="true" cascade="all">
//cascade属性:none 不及连 save-update 插入或更新及连 delete删除及连 all
<key column="classesid"/>
<one-to-many class="Student"/>
</set>
</class>
<class name="com.my.hibernate.Student">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<many-to-one name="classes" column="classesid" cascade="save-update"/>
</class>
public void testSave1(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
//在多方维护
Classes classes=new Classes();
classes.setName("北青");
//session.save(classes);//加了cascade属性可以不用
Student student1=new Student();
student1.setName("黄不接10");
student1.setClasses(classes);
session.save(student1);
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}
public void testLoad1(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
//从多方读取
Student student=(Student)session.load(Student.class, 5);
System.out.println(student.getName());
System.out.println(student.getClasses().getName());
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}
public void testSave2(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
//在一方维护,自动转向多方
Classes classes=new Classes();
classes.setName("尚学堂");
Student student1=new Student();
student1.setName("10");
student1.setClasses(classes);
Student student2=new Student();
student2.setName("祖儿");
student2.setClasses(classes);
Set students=new HashSet();
students.add(student1);
students.add(student2);
classes.setStudents(students);
session.save(classes);
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
//在多方维护
Classes classes=new Classes();
classes.setName("北青");
//session.save(classes);//加了cascade属性可以不用
Student student1=new Student();
student1.setName("黄不接10");
student1.setClasses(classes);
session.save(student1);
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}
public void testLoad1(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
//从多方读取
Student student=(Student)session.load(Student.class, 5);
System.out.println(student.getName());
System.out.println(student.getClasses().getName());
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}
public void testSave2(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
//在一方维护,自动转向多方
Classes classes=new Classes();
classes.setName("尚学堂");
Student student1=new Student();
student1.setName("10");
student1.setClasses(classes);
Student student2=new Student();
student2.setName("祖儿");
student2.setClasses(classes);
Set students=new HashSet();
students.add(student1);
students.add(student2);
classes.setStudents(students);
session.save(classes);
session.getTransaction().commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
}
}
多对多关联映射(单项User---->Role)
<many-to-many/>标签
<set>标签中加入属性table="t_user_role"创建关联表
<!--
User: Role:
private int id; private int id;
private String name; private String name;
private Set roles;
-->
<class name="com.my.hibernate.Role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
<class name="User">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="Role" column="roleid"/>
</set>
</class>
User: Role:
private int id; private int id;
private String name; private String name;
private Set roles;
-->
<class name="com.my.hibernate.Role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
</class>
<class name="User">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="Role" column="roleid"/>
</set>
</class>
public void testSave1(){
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
Role role1=new Role();
role1.setName("1111");
Role role2=new Role();
role2.setName("2222");
Role role3=new Role();
role3.setName("3333"color: #0
Session session=null;
try{
session=HibernateUtils.getSession();
session.beginTransaction();
Role role1=new Role();
role1.setName("1111");
Role role2=new Role();
role2.setName("2222");
Role role3=new Role();
role3.setName("3333"color: #0
发表评论
-
hibernate基础-初步
2009-11-03 15:26 626类拟框架:Apache OJB,JDO,Toplink,EJB ... -
hibernate基础-基本映谢标签和属性
2009-11-03 15:35 664hibernate基本映射 实体类------>表 实体 ... -
hibernate基础-映射关系(多对一I一对一)
2009-11-03 15:53 496多对一关联映射 many-to-one关联映射本质: * ... -
hiberante基础-继承映射
2009-11-03 16:15 753继承映射的三种策略: * 单表继承,每棵类继承树使用一个表 ... -
hibernate基础-其他映射
2009-11-03 16:17 665set、list、array、map Collection: ... -
hibernate基础-自关联映射
2009-11-03 16:19 7521 class Node: private int id;pr ... -
hibernate基础-Component+[联合]映象
2009-11-03 16:22 507Component映射(值对象映射) 在hibernate中, ... -
hibernate基础-lazy策略
2009-11-03 16:33 790lazy策略可以使用在: * <class> ... -
hibernate基础-fetch抓取
2009-11-03 16:34 589抓取策略(单端代理的批量抓取) 1 保持默认,也就是fetch ... -
hibernate基础-Session_Flush
2009-11-03 16:37 695session flush测试: session ... -
hibernate基础-悲观[乐观]锁
2009-11-03 16:40 493悲观锁 悲观锁的实现,通常依赖于数据库机制,在整个过程中将数据 ... -
hiberante基出-缓存
2009-11-03 16:49 501一级缓存 * 一级缓存是缓存实体对象的 * 如果管理一 ... -
hibernate基础-HQL
2009-11-03 17:14 537在hql中关键字不区分大小写,但是属性和类名区分大不写简单属性 ... -
hibernate基础-HibernateTemplate
2009-11-03 17:20 5741 ,void delete ( Object entity ... -
[导入]Hibernate 深入研究之 Criteria
2009-11-03 17:35 565文章来源:http://www.cnblogs.com/ ... -
DetachedCriteria
2009-11-03 17:41 658org.hibernate.criterion.Detache ... -
Restrictions
2009-11-03 17:46 727HQL运算符 ... -
hibernate.cfg.xml
2009-11-03 17:56 612<?xml version="1.0&quo ... -
由映射文件生成表
2009-11-03 17:57 555import org.hibernate.cfg.Confi ... -
JNDI连接池
2009-11-29 21:19 724管理连接对象 Modle:biz,dao,entity 数据源 ...
相关推荐
Hibernate 是一款开源的对象关系映射(Object-Relational Mapping,简称 ORM)框架,它为 Java 应用程序提供了对数据库存储的高效管理和访问能力。Hibernate 5.0.7.Final 版本作为 Hibernate 5.0 系列中的一个稳定版...
Hibernate 4.2.20.Final是这个系列中的一个重要里程碑,它在4.x版本的基础上进行了多方面的优化。 二、核心概念 1. 实体(Entity):在Hibernate中,实体对应数据库表,是一个Java类,通过注解或XML配置与数据库表...
它通过ORM(对象关系映射)实现了数据库的透明访问。 - `hibernate-core.jar`:Hibernate的核心库,包含实体管理、会话工厂和查询API。 - `hibernate-entitymanager.jar`:支持JPA(Java Persistence API)。 - ...
Hibernate,作为Java领域中著名的对象关系映射(ORM)框架,自其诞生以来就受到了广大开发者的热烈追捧。它简化了数据库与Java对象之间的交互,使得开发者可以专注于业务逻辑,而无需过多地关注底层SQL语句的编写。...
同时,使用了内存映射文件技术(MMap)来提高I/O效率,使得大规模数据的检索更为迅速。 除了基本的搜索功能,Hibernate Search还提供了对地理位置信息的支持。通过集成JTS(Java Topology Suite),开发者可以对...
【hibernate 一对多测试工程】是一个基于Hibernate框架的示例项目,旨在演示和测试Hibernate在处理一对一和一对多关系映射时的功能和用法。在这个工程中,我们可以通过具体的代码实例深入理解如何配置和操作数据库中...
以上步骤详细介绍了如何使用Hibernate+IDEA 2018构建一个完整的Hibernate程序,包括环境搭建、项目配置、文件结构设计、配置文件解析、实体类与映射文件编写以及单元测试等内容。通过这些步骤,可以实现一个简单的...
对于Spring 3.0.5 CI-849,可能意味着对3.0.5版本中的一些bug进行了修复,或者增加了新的特性和优化。 8. **文档资源**: 随着“with-docs”一起提供的文档,涵盖了Spring框架的全面教程、API参考以及最佳实践。...
这三个框架分别负责处理不同的层面:Struts2用于MVC(Model-View-Controller)架构中的控制层,Spring作为依赖注入和事务管理的核心,而Hibernate则用于对象关系映射(ORM)。为了确保项目的高效运行,合理地选择和...
【标题】"myeclipse-ci-2018.12.0-online-installer-windows.rar" 是一个针对Windows操作系统设计的MyEclipse集成开发环境的持续集成版本的在线安装程序。MyEclipse是一款功能强大的Java集成开发环境,特别适合进行...
3. Hibernate:Hibernate是一个对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互。通过Hibernate,开发者可以使用Java对象来操作数据库,而无需编写SQL。`hibernate api帮助文档.chm`可能包括实体管理...
首先,我们需要理解一对多关系的基础概念。在数据库设计中,"一对多"意味着一个表(父表)中的单条记录可以与另一个表(子表)中的多条记录相对应。例如,用户表(User)与订单表(Order)之间可能是一对多关系,每...
8. **关联映射**:讨论一对一、一对多、多对一、多对多四种关联关系的映射实现。 9. **事务管理**:阐述Hibernate如何处理事务,包括自动提交、显式事务控制等。 10. **实体状态管理**:解析瞬时态、持久态、托管态...
- **集合属性**:对于多对多或一对多关系使用懒加载。 #### IX. 结论 本文档提供了一个关于如何使用 Tapestry5、Spring 和 Hibernate 构建 Web 应用的详细教程。从环境搭建到实际编码实现,涵盖了整个开发流程的...
- 双向一对多:除了单向关联外,每个其他实体也拥有指向该实体的引用。 - **多对多关联**: - 多对多关联通常需要一个中间表来存储关联关系。 #### 七、数据访问与优化技巧 - **PO和VO**: PO (Persistent Object...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发人员将Java对象模型映射到数据库表,并在对象和数据库之间进行转换。在实际开发过程中,我们经常会遇到需要从多个表中获取数据的情况,这时就需要用到连...
2. **一对多(One-to-Many)**:用于表示一个实体与多个实体之间的关联关系,例如,一个订单可以包含多个订单项。 3. **多对多(Many-to-Many)**:用于表示两个实体集合之间的多对多关联关系,这种关系通常需要...
Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的方式操作数据库,而无需编写大量的SQL代码。SQLite则是一种轻量级、无服务器、自包含的数据库引擎,常用于嵌入式系统或对数据库需求...