`

hibernate基础-映射关系(多对一I一对一)

阅读更多

多对一关联映射 many-to-one
关联映射本质:
  * 将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用。
 
<many-to-one/>标签会在多的一端加入一个外键,指定一的一端,这个外键是由<many-to-one>
中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致

<many-to-one/>标签的定义示例:
  * <many-to-one name="group" column="groupid" cascade="save-update"/>
    其中cascade属性为级联操作,值可以为all、save-update、delete,默认为none
    级联操作:是对象的连锁操作
  * 级联操作的解决方法有两种:1 设cascade属性,2 先进行save操作

<!--
  User:                                      Group:
    private int id;                     private int id;
    private String name;         private String name;
    private Group group;
-->
<class name="com.my.hibernate.Group" table="t_group">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name"/>
</class>

<class name="com.my.hibernate.User" table="t_user">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="name"/>
        
<property name="password"/>
        
<property name="createTime"/>
        
<property name="expireTime"/>
        
<many-to-one name="group" column="groupid" cascade="save-update"/>
</class>

public void testSave1(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            
            session.beginTransaction();
            Group group
=new Group();
            group.setName(
"尚学堂");
            
            User user
=new User();
            user.setName(
"采10");
            user.setPassword(
"123");
            user.setCreateTime(
new Date());
            user.setExpireTime(
new Date());
            user.setGroup(group);
            
            User user1
=new User();
            group.setName(
"尚学堂");
            user1.setName(
"张三");
            user1.setPassword(
"888");
            user1.setCreateTime(
new Date());
            user1.setExpireTime(
new Date());
            user1.setGroup(group);
            
            
//不能成功保存,抛出TransientObjectException异常
            
//因为Group为Transient状态,id没有分配值
            
//persistent状态的对象是不能引用trainsient状态的对象的
            session.save(user);
            session.save(user1);
            session.getTransaction().commit();
        }
catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

    
    
public void testSave2(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            
            session.beginTransaction();
            Group group
=new Group();
            group.setName(
"尚学堂");
            session.save(group);
            
            User user
=new User();
            user.setName(
"采10");
            user.setPassword(
"123");
            user.setCreateTime(
new Date());
            user.setExpireTime(
new Date());
            user.setGroup(group);
            
            User user1
=new User();
            group.setName(
"尚学堂");
            user1.setName(
"张三");
            user1.setPassword(
"888");
            user1.setCreateTime(
new Date());
            user1.setExpireTime(
new Date());
            user1.setGroup(group);

            
//可以存储,因为对Group进行了save操作
            session.save(user);
            session.save(user1);
            session.getTransaction().commit();
        }
catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

    
    
public void testSave3(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            
            session.beginTransaction();
            Group group
=new Group();
            group.setName(
"尚学堂");
            User user
=new User();
            user.setName(
"采10");
            user.setPassword(
"123");
            user.setCreateTime(
new Date());
            user.setExpireTime(
new Date());
            user.setGroup(group);
            
            User user1
=new User();
            group.setName(
"尚学堂");
            user1.setName(
"张三");
            user1.setPassword(
"888");
            user1.setCreateTime(
new Date());
            user1.setExpireTime(
new Date());
            user1.setGroup(group);
            
            
//不会抛出异常,因为采用了cascade属性,所以它会先保存Group
            
//采用cascade属性是解决TransientObjectException异常的一种手段
            session.save(user);
            session.save(user1);
            session.getTransaction().commit();
        }
catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

    
    
public void testload1(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
            User user
=(User)session.load(User.class3);
            System.out.println(user.getName());
            System.out.println(user.getGroup().getName());
            
            session.getTransaction().commit();
        }
catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

一对一关联映射 one-to-one
1 主键关联映射(单向关联Person--->Card)
<one-to-one/>主键关联映射
  * 让两个实体对象的id保持相同,这样可以避免多余的字段被创建
  * 具体映射:
  <id name="id">
   person的主键来源于Card,也就是共享Card的主键
   <generator class="foreign">
    <param name="property">card</param>
   </generator>
  </id>
  <one-to-one/>标签的含义,指示hibernate怎么加载它的关联对象,默认根据主键加载,
  constrained="true",表明当前主键上存在一个约束,person的主键作为外键参照了Card
  <one-to-one name="card" constrained="true"/>
public void testSave1(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
            Card card
=new Card();
            card.setCardNo(
"sadfsaffsf");
            Person person
=new Person();
            person.setName(
"werwer");
            person.setCard(card);
            
//不会出现TransientObjectException异常
            
//因为一对一主键关联映射中,默认为cascade属性
            session.save(person);
            session.getTransaction().commit();
        }
catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

    
    
public void testLoad1(){
        Session session
=null;
        
try{
            session
=HibernateUtils.getSession();
            session.beginTransaction();
            
            Person person
=(Person)session.load(Person.class7);
            System.out.print(person.getName());
            System.out.print(person.getCard().getCardNo());
            
            session.getTransaction().commit();
        }
catch(Exception e){
            e.printStackTrace();
            session.getTransaction().rollback();
        }
finally{
            HibernateUtils.closeSession(session);
        }

    }

 

一对一关联映射 one-to-one
2 主键关联映射(双向关联Person<--->Card)
需要在Card映射文件中加入<one-to-one/>标签指向person,指示hibernate如何加载person
默认根据主键加载
只能用于查询,load和get

<!--
  Person:                              Card:
    private int id;                  private int id;
    private String name;      private String cardNo;
    private Card card;          private Person person;
-->        
<class name="com.my.hibernate.Card" table="t_card">
        
<id name="id">
            
<generator class="native"/>
        
</id>
        
<property name="cardNo"/>
        
<one-to-one name="person"/>
</class>

<class name="com.my.hibernate.Person" table="t_person">
        
<id name="id">
            
<generator class="foreign">
                
<param name="property">card</param>
            
</generator>
        
</id>
        
<property name="name"/>
        
<one-to-one name="card" constrained="true"/>
</class>

相关推荐

    hibernate-release-5.0.7.Final.zip官方

    Hibernate 是一款开源的对象关系映射(Object-Relational Mapping,简称 ORM)框架,它为 Java 应用程序提供了对数据库存储的高效管理和访问能力。Hibernate 5.0.7.Final 版本作为 Hibernate 5.0 系列中的一个稳定版...

    Struts2-Hibernate-Integration-Example.zip_I Do

    Struts2是一个用于构建MVC(Model-View-Controller)架构的框架,而Hibernate则是一个对象关系映射(ORM)工具,使得Java开发者可以更加方便地处理数据库操作。在"Struts2-Hibernate-Integration-Example.zip_I Do...

    Struts-Spring-Hibernate-MySql-JDK-ibatis

    3. Hibernate:Hibernate是一个对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互。通过Hibernate,开发者可以使用Java对象来操作数据库,而无需编写SQL。`hibernate api帮助文档.chm`可能包括实体管理...

    Java -- 在Eclipse上使用Hibernate

    这一步骤是必要的,用于告诉Hibernate哪些映射文件需要被加载: - **配置映射资源**: - 在Package Explorer中选中需要配置的`.hbm.xml`文件。 - 右键选择 `Hibernate Synchronizer -&gt; Add Mapping Reference`,...

    Hibernate+IDEA 2018 一个hibernate程序

    以上步骤详细介绍了如何使用Hibernate+IDEA 2018构建一个完整的Hibernate程序,包括环境搭建、项目配置、文件结构设计、配置文件解析、实体类与映射文件编写以及单元测试等内容。通过这些步骤,可以实现一个简单的...

    hibernate-release-4.2.20.Final.zip

    Hibernate 4.2.20.Final是这个系列中的一个重要里程碑,它在4.x版本的基础上进行了多方面的优化。 二、核心概念 1. 实体(Entity):在Hibernate中,实体对应数据库表,是一个Java类,通过注解或XML配置与数据库表...

    hibernate 一对多测试工程

    在Java对象关系映射(ORM)框架如Hibernate中,一对多关系是一种常见的数据库表关联类型,它反映了现实世界中的一种多对一关系,例如一个班级可以有多个学生,而一个学生只属于一个班级。在数据库设计中,通常通过在...

    hibernate-release-5.2.6.Final.zip

    Hibernate,作为Java领域中著名的对象关系映射(ORM)框架,自其诞生以来就受到了广大开发者的热烈追捧。它简化了数据库与Java对象之间的交互,使得开发者可以专注于业务逻辑,而无需过多地关注底层SQL语句的编写。...

    hibernate-search-3.1.1.GA-dist

    同时,使用了内存映射文件技术(MMap)来提高I/O效率,使得大规模数据的检索更为迅速。 除了基本的搜索功能,Hibernate Search还提供了对地理位置信息的支持。通过集成JTS(Java Topology Suite),开发者可以对...

    Hibernate原理

    1. **一对一(One-to-One)**:用于表示两个实体之间的一对一关联关系,通常通过主键或外键来实现。 2. **一对多(One-to-Many)**:用于表示一个实体与多个实体之间的关联关系,例如,一个订单可以包含多个订单项...

    hibernate 开发指南下载

    - **一对一关联**: - 单向关联:实体A拥有指向实体B的引用。 - 双向关联:除了单向关联外,实体B也拥有指向实体A的引用。 - **一对多关联**: - 单向一对多:一个实体可以拥有多个其他实体的实例。 - 双向一对...

    Hibernate3学习笔记(一)-hibernate概述和简单实例入门

    8. **关联映射**:讨论一对一、一对多、多对一、多对多四种关联关系的映射实现。 9. **事务管理**:阐述Hibernate如何处理事务,包括自动提交、显式事务控制等。 10. **实体状态管理**:解析瞬时态、持久态、托管态...

    Hibernate最新中文教程

    - **一对一映射**:使用 @OneToOne 注解实现。 - **一对多映射**:使用 @OneToMany 或 @ManyToOne 注解实现。 - **多对多映射**:使用 @ManyToMany 实现,通常需要关联表。 - **继承映射**:支持单表继承、分类继承...

    Hibernate连表查询 Hibernate连表查询

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发人员将Java对象模型映射到数据库表,并在对象和数据库之间进行转换。在实际开发过程中,我们经常会遇到需要从多个表中获取数据的情况,这时就需要用到连...

    SSH(Spring+Hibernate+Struts2)框架整合必须的85个jar包

    它通过ORM(对象关系映射)实现了数据库的透明访问。 - `hibernate-core.jar`:Hibernate的核心库,包含实体管理、会话工厂和查询API。 - `hibernate-entitymanager.jar`:支持JPA(Java Persistence API)。 - ...

    hibernate_reference(中文文档)

    6. **一对多、多对一、多对多关联映射**:关系数据库中的这些关联在Hibernate中得到了很好的支持,文档会讲解如何配置和使用这些关联关系。 7. **性能优化**:包括一级缓存(First-Level Cache)和二级缓存(Second...

    sqlite-hibernate

    Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的方式操作数据库,而无需编写大量的SQL代码。SQLite则是一种轻量级、无服务器、自包含的数据库引擎,常用于嵌入式系统或对数据库需求...

    Hibernate对BLOB CLOB操作

    同时,Hibernate的实体映射文件(例如`Users.hbm.xml`)用于定义实体类与数据库表之间的映射关系,其中包括了如何处理BLOB和CLOB字段。 以`Users.hbm.xml`为例,假设我们有一个`Users`实体类,其中有一个`...

Global site tag (gtag.js) - Google Analytics