- 浏览: 115142 次
- 性别:
- 来自: 上海
文章分类
最新评论
多对一关联映射 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>
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.class, 3);
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);
}
}
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.class, 3);
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.class, 7);
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);
}
}
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.class, 7);
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>
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>
<img
发表评论
-
hibernate基础-初步
2009-11-03 15:26 625类拟框架:Apache OJB,JDO,Toplink,EJB ... -
hibernate基础-基本映谢标签和属性
2009-11-03 15:35 663hibernate基本映射 实体类------>表 实体 ... -
hibernate基础-映射关系(一对多I多对多).
2009-11-03 16:04 599一对多关联映射(one-to-many) 一对多关联映射利用了 ... -
hiberante基础-继承映射
2009-11-03 16:15 752继承映射的三种策略: * 单表继承,每棵类继承树使用一个表 ... -
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 789lazy策略可以使用在: * <class> ... -
hibernate基础-fetch抓取
2009-11-03 16:34 589抓取策略(单端代理的批量抓取) 1 保持默认,也就是fetch ... -
hibernate基础-Session_Flush
2009-11-03 16:37 694session flush测试: session ... -
hibernate基础-悲观[乐观]锁
2009-11-03 16:40 493悲观锁 悲观锁的实现,通常依赖于数据库机制,在整个过程中将数据 ... -
hiberante基出-缓存
2009-11-03 16:49 500一级缓存 * 一级缓存是缓存实体对象的 * 如果管理一 ... -
hibernate基础-HQL
2009-11-03 17:14 536在hql中关键字不区分大小写,但是属性和类名区分大不写简单属性 ... -
hibernate基础-HibernateTemplate
2009-11-03 17:20 5731 ,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 611<?xml version="1.0&quo ... -
由映射文件生成表
2009-11-03 17:57 554import org.hibernate.cfg.Confi ... -
JNDI连接池
2009-11-29 21:19 723管理连接对象 Modle:biz,dao,entity 数据源 ...
相关推荐
Hibernate 是一款开源的对象关系映射(Object-Relational Mapping,简称 ORM)框架,它为 Java 应用程序提供了对数据库存储的高效管理和访问能力。Hibernate 5.0.7.Final 版本作为 Hibernate 5.0 系列中的一个稳定版...
Struts2是一个用于构建MVC(Model-View-Controller)架构的框架,而Hibernate则是一个对象关系映射(ORM)工具,使得Java开发者可以更加方便地处理数据库操作。在"Struts2-Hibernate-Integration-Example.zip_I Do...
3. Hibernate:Hibernate是一个对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互。通过Hibernate,开发者可以使用Java对象来操作数据库,而无需编写SQL。`hibernate api帮助文档.chm`可能包括实体管理...
这一步骤是必要的,用于告诉Hibernate哪些映射文件需要被加载: - **配置映射资源**: - 在Package Explorer中选中需要配置的`.hbm.xml`文件。 - 右键选择 `Hibernate Synchronizer -> Add Mapping Reference`,...
以上步骤详细介绍了如何使用Hibernate+IDEA 2018构建一个完整的Hibernate程序,包括环境搭建、项目配置、文件结构设计、配置文件解析、实体类与映射文件编写以及单元测试等内容。通过这些步骤,可以实现一个简单的...
Hibernate 4.2.20.Final是这个系列中的一个重要里程碑,它在4.x版本的基础上进行了多方面的优化。 二、核心概念 1. 实体(Entity):在Hibernate中,实体对应数据库表,是一个Java类,通过注解或XML配置与数据库表...
在Java对象关系映射(ORM)框架如Hibernate中,一对多关系是一种常见的数据库表关联类型,它反映了现实世界中的一种多对一关系,例如一个班级可以有多个学生,而一个学生只属于一个班级。在数据库设计中,通常通过在...
Hibernate,作为Java领域中著名的对象关系映射(ORM)框架,自其诞生以来就受到了广大开发者的热烈追捧。它简化了数据库与Java对象之间的交互,使得开发者可以专注于业务逻辑,而无需过多地关注底层SQL语句的编写。...
同时,使用了内存映射文件技术(MMap)来提高I/O效率,使得大规模数据的检索更为迅速。 除了基本的搜索功能,Hibernate Search还提供了对地理位置信息的支持。通过集成JTS(Java Topology Suite),开发者可以对...
1. **一对一(One-to-One)**:用于表示两个实体之间的一对一关联关系,通常通过主键或外键来实现。 2. **一对多(One-to-Many)**:用于表示一个实体与多个实体之间的关联关系,例如,一个订单可以包含多个订单项...
- **一对一关联**: - 单向关联:实体A拥有指向实体B的引用。 - 双向关联:除了单向关联外,实体B也拥有指向实体A的引用。 - **一对多关联**: - 单向一对多:一个实体可以拥有多个其他实体的实例。 - 双向一对...
8. **关联映射**:讨论一对一、一对多、多对一、多对多四种关联关系的映射实现。 9. **事务管理**:阐述Hibernate如何处理事务,包括自动提交、显式事务控制等。 10. **实体状态管理**:解析瞬时态、持久态、托管态...
- **一对一映射**:使用 @OneToOne 注解实现。 - **一对多映射**:使用 @OneToMany 或 @ManyToOne 注解实现。 - **多对多映射**:使用 @ManyToMany 实现,通常需要关联表。 - **继承映射**:支持单表继承、分类继承...
Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发人员将Java对象模型映射到数据库表,并在对象和数据库之间进行转换。在实际开发过程中,我们经常会遇到需要从多个表中获取数据的情况,这时就需要用到连...
它通过ORM(对象关系映射)实现了数据库的透明访问。 - `hibernate-core.jar`:Hibernate的核心库,包含实体管理、会话工厂和查询API。 - `hibernate-entitymanager.jar`:支持JPA(Java Persistence API)。 - ...
6. **一对多、多对一、多对多关联映射**:关系数据库中的这些关联在Hibernate中得到了很好的支持,文档会讲解如何配置和使用这些关联关系。 7. **性能优化**:包括一级缓存(First-Level Cache)和二级缓存(Second...
Hibernate是一个流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的方式操作数据库,而无需编写大量的SQL代码。SQLite则是一种轻量级、无服务器、自包含的数据库引擎,常用于嵌入式系统或对数据库需求...
同时,Hibernate的实体映射文件(例如`Users.hbm.xml`)用于定义实体类与数据库表之间的映射关系,其中包括了如何处理BLOB和CLOB字段。 以`Users.hbm.xml`为例,假设我们有一个`Users`实体类,其中有一个`...