- 浏览: 51232 次
- 性别:
- 来自: 长沙
最新评论
-
yaojianxiaoyu:
看你貌似不知道怎么弄,
public class BaseD ...
请教关于得到泛型的class -
d_xxm:
clazz = (Class<T>) ((Pa ...
请教关于得到泛型的class -
jiajia11:
其实第二种方法我觉得不是泛型的应用,你把<T>去掉 ...
请教关于得到泛型的class -
feisan:
推荐使用pylibmc
cmemcache不是很稳定
ubuntu9.04编译安装libmemcache1.4.0.rc -
seman18:
assertTrue("check",a= ...
hibernate入门使用系列 1-- 说明篇+试用篇
接上篇 hibernate入门使用系列 1-- 说明篇+试用篇
现在起主要讲 hibernate中的关系映射。对应的关系主要有 1:1, n:1, n:n。今天主要写1:1。
关系映射篇(上)—— 之1:1
1对1的关系在现实中很常见。比方说:人和身份证。1个身份证对应着一个身份证,一个身份证对应着一个人。那么,我们就以此为原型。进行代码编写。
建立实体模型如右:
根据模型,创建数据库:
use HibernateQuickUse; drop table if exists Person; drop table if exists Card; create table Card ( id varchar(32) primary key, cardDesc varchar(128) not null ); create table Person ( id varchar(32) primary key, name varchar(32) not null, card_id varchar(32) not null, foreign key(card_id) references Card(id) );
java代码如下:
Person类
package org.py.hib.relation.one2one; /** * Person entity. */ @SuppressWarnings("serial") public class Person implements java.io.Serializable { private String id; private String name; private Card card; public Person() { } public String getId() { return this.id; } public void setId(String id) { this.id = id; } public Card getCard() { return this.card; } public void setCard(Card card) { this.card = card; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } }
Card类:
package org.py.hib.relation.one2one; /** * Card entity. */ @SuppressWarnings("serial") public class Card implements java.io.Serializable { private String id; private String cardDesc; public Card() { } public String getId() { return this.id; } public void setId(String id) { this.id = id; } public String getCardDesc() { return cardDesc; } public void setCardDesc(String cardDesc) { this.cardDesc = cardDesc; } }
xml映射文件如下:
Person.hbm.xml
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name="org.py.hib.relation.one2one.Person" table="person"> <id name="id" type="java.lang.String" column="id" length="32"> <generator class="uuid" /> </id> <property name="name" type="java.lang.String"> <column name="name" length="32" /> </property> <many-to-one name="card" class="org.py.hib.relation.one2one.Card" unique="true" cascade="all" column="card_id" /> </class> </hibernate-mapping>
今天讲的是one-to-one配置。但是,此处用的是many-to-one,这个是什么原因呢?其实,one-to-one就是特殊的many-to-one。
Card.hbm.xml:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping> <class name="org.py.hib.relation.one2one.Card" table="card"> <id name="id" type="java.lang.String" column="id" length="32"> <generator class="uuid" /> </id> <property name="cardDesc" type="java.lang.String" column="cardDesc" length="128" not-null="true"/> </class> </hibernate-mapping>
测试代码如下:
One2OneTest.java
package org.py.hib.relation.one2one; import junit.framework.Assert; import junit.framework.TestCase; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.junit.After; import org.junit.Before; public class One2OneTest extends TestCase { private SessionFactory factory; private String m_name = "ryanpoy"; private String m_name2 = "ryanpoy2"; private String m_cardDesc1 = "desc_1"; private String m_cardDesc2 = "desc_2"; @Before public void setUp() throws Exception { Configuration conf = new Configuration().configure(); factory = conf.buildSessionFactory(); } /** * 测试添加 * @throws Exception */ public void testSave() throws Exception { System.out.println("\n=== test save ==="); Card card = new Card(); card.setCardDesc(m_cardDesc1); Person person = new Person(); person.setName(m_name); // 设置用户名 = m_name person.setCard(card); Session session = null; Transaction tran = null; try { session = factory.openSession(); tran = session.beginTransaction(); session.save(person); tran.commit(); Assert.assertEquals(person.getId() != null, true); Assert.assertEquals(card.getId() != null, true); } catch (Exception ex) { tran.rollback(); throw ex; } finally { if (session != null) { try { session.close(); } catch (Exception ex) { // nothing to do } finally { if (session != null) session = null; } } } } /** * 测试查询 * @throws Exception */ public void testFind() throws Exception { System.out.println("\n=== test find ==="); Session session = null; try { session = factory.openSession(); Person person = (Person) session.createQuery("from Person").list().get(0); Assert.assertEquals(true, person.getId() != null); Assert.assertEquals(m_name, person.getName()); Assert.assertEquals(true, person.getCard().getId() != null); Assert.assertEquals(m_cardDesc1, person.getCard().getCardDesc()); } catch (Exception ex) { throw ex; } finally { if (session != null) { try { session.close(); } catch (Exception ex) { // nothing to do } finally { if (session != null) session = null; } } } } /** * 测试修改 * @throws Exception */ public void testModify() throws Exception { System.out.println("\n=== test modify ==="); Session session = null; Transaction tran = null; try { session = factory.openSession(); tran = session.beginTransaction(); Person person = (Person) session.createQuery("from Person").list().get(0); person.setName(m_name2); // 修改用户名 = m_name2.(原来用户名= m_name) person.getCard().setCardDesc(m_cardDesc2); // 修改cardDesc 为 m_cardDesc2 (原来是:m_cardDesc1) tran.commit(); } catch (Exception ex) { throw ex; } finally { if (session != null) { try { session.close(); } catch (Exception ex) { // nothing to do } finally { if (session != null) session = null; } } } /* * 修改后再查询 */ System.out.println("\n=== test find after modify ==="); try { session = factory.openSession(); Person person = (Person) session.createQuery("from Person").list().get(0); Assert.assertEquals(true, person.getId() != null); Assert.assertEquals(m_name2, person.getName()); Assert.assertEquals(true, person.getCard().getId() != null); Assert.assertEquals(m_cardDesc2, person.getCard().getCardDesc()); } catch (Exception ex) { throw ex; } finally { if (session != null) { try { session.close(); } catch (Exception ex) { // nothing to do } finally { if (session != null) session = null; } } } } /** * 测试删除 * @throws Exception */ public void testDelete() throws Exception { System.out.println("\n=== test delete ==="); Session session = null; Transaction tran = null; try { session = factory.openSession(); tran = session.beginTransaction(); Person person = (Person) session.createQuery("from Person").list().get(0); session.delete(person); tran.commit(); } catch (Exception ex) { throw ex; } finally { if (session != null) { try { session.close(); } catch (Exception ex) { // nothing to do } finally { if (session != null) session = null; } } } /* * 删除后再查询 */ System.out.println("\n=== test find after delete ==="); try { session = factory.openSession(); Integer num = (Integer) session.createQuery("from Person").list().size(); Assert.assertEquals(0, num.intValue()); num = (Integer) session.createQuery("from Card").list().size(); Assert.assertEquals(0, num.intValue()); } catch (Exception ex) { throw ex; } finally { if (session != null) { try { session.close(); } catch (Exception ex) { // nothing to do } finally { if (session != null) session = null; } } } } /** * */ @After public void tearDown() throws Exception { factory.close(); } }
运行test,一路飚绿。呵呵。陶醉一番。不过,这也就是一个拿不出手的测试和一个拿不出手的例子。没有任何实际意义的例子。仅此一个demo而已。
在1:1中,其实还有一种方式,即:唯一主见关联。但是,我一直倾向于上面的这种形式,所以,唯一主见关联的旧部介绍了。
评论
12 楼
only_java
2009-01-12
RyanPoy 写道
only_java 写道
在测试你的函数testsave时,结果为: Hibernate: insert into card (cardDesc, id) values (?, ?) Hibernate: insert into person (name, card_id, id) values (?, ?, ?) 我照着你的例子重新做的时候,却发现结果是:(报异常) Hibernate: insert into hibernatequickuse.person (name, card_id) values (?, ?) Hibernate: update card set NAME=? where ID=? 不同的是主键的生成方式不一样,你用的是uuid,我用的是identity,数据库自动增长 看了你帖的代码。看不出什么问题。不过从生成的sql语句不同。可以看出,你的配置和我的不一样。不是说主键配置不同。肯定还有其他的地方不同。你再看看。
谢谢,问题解决了!sql是我改动了些,但还是保持单向多对一的,原因是我映射文件的头部是引用2.0的Hibernate,而包却是3.0的!
11 楼
RyanPoy
2009-01-09
only_java 写道
在测试你的函数testsave时,结果为:
Hibernate: insert into card (cardDesc, id) values (?, ?)
Hibernate: insert into person (name, card_id, id) values (?, ?, ?)
我照着你的例子重新做的时候,却发现结果是:(报异常)
Hibernate: insert into hibernatequickuse.person (name, card_id) values (?, ?)
Hibernate: update card set NAME=? where ID=?
不同的是主键的生成方式不一样,你用的是uuid,我用的是identity,数据库自动增长
Hibernate: insert into card (cardDesc, id) values (?, ?)
Hibernate: insert into person (name, card_id, id) values (?, ?, ?)
我照着你的例子重新做的时候,却发现结果是:(报异常)
Hibernate: insert into hibernatequickuse.person (name, card_id) values (?, ?)
Hibernate: update card set NAME=? where ID=?
不同的是主键的生成方式不一样,你用的是uuid,我用的是identity,数据库自动增长
看了你帖的代码。看不出什么问题。不过从生成的sql语句不同。可以看出,你的配置和我的不一样。不是说主键配置不同。肯定还有其他的地方不同。你再看看。
10 楼
only_java
2009-01-07
在测试你的函数testsave时,结果为:
Hibernate: insert into card (cardDesc, id) values (?, ?)
Hibernate: insert into person (name, card_id, id) values (?, ?, ?)
我照着你的例子重新做的时候,却发现结果是:(报异常)
Hibernate: insert into hibernatequickuse.person (name, card_id) values (?, ?)
Hibernate: update card set NAME=? where ID=?
不同的是主键的生成方式不一样,你用的是uuid,我用的是identity,数据库自动增长
Hibernate: insert into card (cardDesc, id) values (?, ?)
Hibernate: insert into person (name, card_id, id) values (?, ?, ?)
我照着你的例子重新做的时候,却发现结果是:(报异常)
Hibernate: insert into hibernatequickuse.person (name, card_id) values (?, ?)
Hibernate: update card set NAME=? where ID=?
不同的是主键的生成方式不一样,你用的是uuid,我用的是identity,数据库自动增长
Card card = new Card(); card.setCardDesc(m_cardDesc1); Person person = new Person(); person.setName(m_name); // 设置用户名 = m_name person.setCard(card); Session session = null; Transaction tran = null; try { session = factory.openSession(); tran = session.beginTransaction(); session.save(person); //应该先执行insert person才对啊???? tran.commit();
9 楼
only_java
2008-12-29
one-to-one就是特殊的many-to-one
能否解释下?
能否解释下?
8 楼
liucl_tiger
2008-10-24
能不能用SSH框架写一个出来看一下呢!
还是感受很深!
还是感受很深!
7 楼
tianzhijie11
2008-10-23
谢谢文章写的不错。太感谢了
6 楼
RyanPoy
2008-06-22
wxb_love 写道
楼主的id好象不是递增的啊,要加个递增怎么弄啊。
1.修改数据库的主键为auto_increment
2.修改pojo的主键为integer
3.修改hbm.xml中的id的generator ,把uuid改成为native
5 楼
wxb_love
2008-06-17
楼主的id好象不是递增的啊,要加个递增怎么弄啊。
4 楼
RyanPoy
2008-06-17
tjlvan 写道
弱弱的问一下 删除person的时候为什么会把card也干掉啊 他们不是对于数据库两张表么 具体需要怎么设置
参看Person.hbm.xml配置文件中16行有这样子的一句话: cascade="all"
这里的cascade设置成为了all,那么就出现了你说的这个现象。
其实cascade有很多中设置:create, merge, save-update, delete, lock, refresh, evict, replicate。。。
每一种都有其不同的含义。具体的请google一下。
如果要想删除person而不删除card,请修改为:delete-orphan
3 楼
tjlvan
2008-05-31
弱弱的问一下 删除person的时候为什么会把card也干掉啊 他们不是对于数据库两张表么 具体需要怎么设置
2 楼
RyanPoy
2008-05-07
hantsy 写道
这个只是单向关联one-to-one ,而且是不严格的,不准确的,你要指明many-to-one是表示一个“一对一”关系,至少要用上unique。
多谢指出。已经修改过了。源代码也已经修改了。
hantsy 写道
one-to-one ,有很多东西可以讨论。
1.单向关联或双向关联
确实有单项关联和双向关联这2种。且任何的关系(1:1, ... n:n)都有单项和双向之分。在这个例子中里面我只用了单项。
抽空补上双向。
hantsy 写道
2.使用cascade
这个我一直认为且只认为代表级联操作,我觉得与1:1, ... , n:n都没有关系。
hantsy 写道
3.使用中间表
这个在n:n中,倒是用过。不知道你说的1:1中,采用中间表是什么意思。
是指临时表么?
1 楼
hantsy
2008-05-07
这个只是单向关联one-to-one ,而且是不严格的,不准确的,你要指明many-to-one是表示一个“一对一”关系,至少要用上unique。
one-to-one ,有很多东西可以讨论。
1.单向关联或双向关联
2.使用cascade
3.使用中间表
one-to-one ,有很多东西可以讨论。
1.单向关联或双向关联
2.使用cascade
3.使用中间表
发表评论
-
hibernate入门使用系列 8-- annotation关系映射篇(下)
2008-11-12 17:27 1942终于要说ManyToMany了 场景:Product和Cust ... -
hibernate入门使用系列 7-- annotation关系映射篇(中)
2008-11-12 16:38 1630这次说说OneToMany和ManyToO ... -
hibernate入门使用系列 6-- annotation关系映射篇(上)
2008-11-12 15:55 2556次讲@OneToOne的用法。而且是基于主外键的关联。因为这个 ... -
hibernate入门使用系列 5 -- xml关系映射篇(补充1)
2008-07-18 18:02 1623由于最近一段时间比较忙。一直被手中的项目牵着。所以,也就没有时 ... -
hibernate入门使用系列 4-- xml关系映射篇(下)
2008-05-07 17:39 3094接上篇 hibernate入门使用系列 3-- xml关系映射 ... -
hibernate入门使用系列 3-- xml关系映射篇(中)
2008-05-07 14:40 2672接上篇 hibernate入门使用系列 2-- xml关系映射 ... -
hibernate入门使用系列 1-- 说明篇+试用篇
2008-05-05 11:09 3764说明篇 写这个 入门使用 系列的文章, 学习笔 ... -
要不要在数据库中建立主外键约束
2008-05-04 12:48 4786今天发现一个问题。一个遗留的系统上,每个表都是独立的, ...
相关推荐
- **XML映射文件**: 传统上,我们使用`hbm.xml`文件来定义对象关系映射。每个实体类都有一个对应的映射文件,其中定义了属性与数据库字段的映射关系。 - **注解映射**: 现代Hibernate更倾向于使用注解进行映射,...
"Hibernate入门到精通" Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 ...
- 可以在实体类上使用注解替代XML配置文件。 通过以上步骤,我们可以看到Hibernate不仅提供了强大的数据库交互能力,还极大地简化了JavaEE项目的开发过程。对于初学者而言,掌握这些基础知识是非常重要的。
本压缩包提供的是Hibernate入门所需的jar包,包括了Hibernate的核心库以及与之配合使用的相关组件。让我们深入探讨一下这些jar包以及它们在Hibernate中的作用。 1. Hibernate核心库: - `hibernate-core.jar`:这...
Hibernate 是一个对象关系映射(ORM)框架,它允许开发者将Java对象与数据库表进行映射,简化了数据库操作。在Myeclipse中,通过Add Hibernate Capabilities来添加Hibernate支持。配置时,可以选择Hibernate版本(如...
2. Entity:表示数据库中的表,通过注解或XML配置与数据库表建立映射关系。 3. Mapping:对象关系映射,定义了对象属性与数据库字段的对应关系。 4. Transaction:事务管理,确保数据库操作的一致性和完整性。 五、...
【hibernate教程-从入门到精通-第4篇(共四篇)共2】这篇教程是关于Java持久层框架Hibernate的学习指南,旨在帮助初学者深入理解并掌握Hibernate的核心概念和技术。Hibernate作为一款强大的对象关系映射(ORM)工具,...
若使用XML映射,创建对应的`orm.hbm.xml`文件。 5. **初始化SessionFactory**:在应用程序启动时,根据`hibernate.cfg.xml`创建SessionFactory实例。 6. **使用Session**:通过SessionFactory获取Session,执行...
3. 映射实体类:使用XML映射文件(`.hbm.xml`)或注解来定义Java类与数据库表的关系。 4. 初始化SessionFactory:在应用程序启动时,根据配置文件创建SessionFactory实例,它是线程安全的,整个应用程序只需要一个。...
在本教程“使用Hibernate开发租房系统7-11”中,我们将深入探讨如何利用Hibernate这一强大的对象关系映射(ORM)框架来构建一个完整的租房管理应用程序。Hibernate是Java开发人员常用于简化数据库交互的工具,它允许...
**hibernate系列(一)hibernate入门** 在Java世界中,ORM(Object-Relational Mapping,对象关系映射)框架是连接数据库与应用程序的重要桥梁,它将数据库中的数据与程序中的对象进行关联,使得开发者可以使用面向...
本文将深入探讨 Hibernate 中的一对一映射关系,并以"hibernate 映射关系学习入门 一对一映射Eclipse源码"为主题,详细解析其概念、配置以及实际应用。 一对一映射是Hibernate中的一种关联关系,它表示两个实体之间...
本文档旨在指导读者快速从 Hibernate 入门到掌握 Hibernate 的使用。 Hibernate 配置文件 在使用 Hibernate 之前,需要将相关的 JAR 包导入到项目中。这些 JAR 包位于 `hibernate-release-4.2.5.Final\lib\...
在Hibernate中,一对多关系的映射通常通过XML配置文件(hibernate.cfg.xml)或注解实现。这里我们主要讨论注解方式: 1. 在父实体类上,我们需要使用`@OneToMany`注解来定义一对多关系。这个注解包含以下属性: - ...
【hibernate入门小例子】是一个适合初学者的教程,主要涵盖了如何在JavaWeb项目中使用Hibernate框架与MySQL数据库进行集成。在这个例子中,我们将会深入理解Hibernate的核心概念,包括实体映射、对象关系映射(ORM)...
### Hibernate经典入门篇知识点梳理 #### 一、Hibernate简介与作用 - **概念**:Hibernate是一种开放源码的对象关系映射(ORM)框架,用于Java应用与关系型数据库之间的交互。它提供了一种机制,使得Java对象能够...
然后,创建一个简单的实体类,例如`User`,并使用注解或XML映射文件将其映射到数据库中的`users`表。 **第二部分:Hibernate入门(下)** 在这一部分,我们将学习如何初始化SessionFactory,这是Hibernate的核心...
Hibernate 的主要特点是将对象关系映射(O/R Mapping)技术应用于关系数据库,实现了对象到关系数据库的无缝集成。 为什么选择 Hibernate Hibernate 的出现是为了解决传统的 JDBC 编程中的问题。传统的 JDBC 编程...
**hibernate入门** Hibernate 是一个强大的Java持久化框架,它简化了数据库操作,使得开发者无需直接编写SQL语句即可实现对象与关系数据库之间的映射。这个文档将带你步入Hibernate的世界,了解其基本概念和核心...
《经典Hibernate教程_从入门到精通》第一篇主要介绍了ORM概述和Hibernate的作用,以及Hibernate应用程序的基本结构和JDBC与Hibernate的对比。以下是详细的知识点解析: 1. **ORM概述** - ORM(Object-Relational ...