`
sunchenjava
  • 浏览: 32272 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

对《深入浅出hibernate》一书中one-to-one主键关联映射疑惑

阅读更多

这两天在研究hibernate,发现<<深入浅出hibernate>>一书挺好,清晰易懂,只是在看到one to one 主键关联映射的地方,有些疑惑。

 

关系模型是这样的,很简单,如下:

 

T_Person

id  number(11) <pk,fk>

name varchar2(50)

age number(3)

.....

 

 

T_PASSPORT

id number(11) <pk>,

serial varchar2(20),

expiry number(11)

 

如上,T_Person的id即是主键又是外键,引用T_PASSPORT的主键字段id.并且它们是一对一的关系。

 

对应的实体类如下:

 

 

TPerson implents Serializable
+TPerson

id:Integer

age:Integer

name:String

passport:TPassport

 

 

 

TPassport implents Serializable
+Tpassport

id:Integer

serial:String

expiry:Integer

person:Tperson

 

实体关系如上,它们建立了双向一对一关系,具体映射文件如下:

 

<?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="com.alcatel.cn.hibernate.ORMapping.onetoone.pojo.TPerson" table="T_PERSON">
		<id name="id" column="id" type="java.lang.Integer">
		<generator class="sequence">
				<param name="sequence">person_seq</param>
			</generator>
		</id>
		<property name="name" type="string" column="name"></property>
		<property name="age" type="java.lang.Integer" column="age"></property>
		<one-to-one name="passport"  class="com.alcatel.cn.hibernate.ORMapping.onetoone.pojo.TPassport"
					cascade="all"
					outer-join="true"/>
	</class>
</hibernate-mapping>     

 

 

 

 

<?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="com.alcatel.cn.hibernate.ORMapping.onetoone.pojo.TPassport" table="T_PASSPORT">
		<id name="id" column="id" type="java.lang.Integer">
			
			<generator class="foreign">
				<param name="property">person</param>
			</generator>
			
		</id>
		<one-to-one name="person"
					class="com.alcatel.cn.hibernate.ORMapping.onetoone.pojo.TPerson"
					constrained="true"
					></one-to-one>
		<property name="serial" type="string" column="SERIAL"></property>
		<property name="expiry" type="java.lang.Integer" column="EXPIRY"></property>
	</class>
</hibernate-mapping>

 

 

    测试代码如下:

 

 

package com.alcatel.cn.hibernate.ORMapping.onetoone.test;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.alcatel.cn.hibernate.ORMapping.onetoone.pojo.TPassport;
import com.alcatel.cn.hibernate.ORMapping.onetoone.pojo.TPerson;
import com.alcatel.cn.hibernate.common.HibernateUtil;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Session s=HibernateUtil.currentSession();
		
		TPerson p=new TPerson();
		p.setAge(20);
		p.setName("Sunrui");
		
		TPassport passport=new TPassport();
		passport.setSerial("PCN759386");
		passport.setExpiry(new Integer(2));
		
		//相互设置关联
		passport.setPerson(p);
		p.setPassport(passport);
		
		
		try{
			Transaction tx=s.beginTransaction();
			
			s.save(p);//注意:这里只对Person进行保存
			tx.commit();
			
			TPassport pp=(TPassport)s.load(TPassport.class, new Integer(5));
			System.out.println("Passport Serial ==>"+pp.getSerial());
			System.out.println("Person name==>"+pp.getPerson().getName());
		}catch(Exception e){
			e.printStackTrace();
		}
	}

}

 

运行,出现如下异常:

 

Hibernate: select person_seq.nextval from dual
Hibernate: insert into T_PERSON (name, age, id) values (?, ?, ?)
org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:71)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:249)
	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:92)
	at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:87)
	at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:218)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2159)
	at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2595)
	at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:51)
	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:232)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:139)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
	at com.alcatel.cn.hibernate.ORMapping.onetoone.test.Test.main(Test.java:36)
Caused by: java.sql.BatchUpdateException: ORA-02291: integrity constraint (HIBERNATE.FK_PASSPORT) violated - parent key not found

 

 

 

仔细把自己的代码与书中的实例对照了下,发现没有任何差错,但确确实实发生异常了。仔细分析了下,这个异常是违反了约束性,第一想到的是违反了外键约束,看看日志(阴影部分),它确实是先往T_Person表里插入记录,当然找不到对应的T_Passport的id,违反了外键约束。

 

我尝试了把Person.hbm.xml与Passport.hbm.xml中配置方式互换,即让Passport.hbm.xml维护主键生成,然后Person.hbm.xml配置外键生成方式。运行完好。

 

这里,我从不怀疑<<深入浅出Hibernate>>作者的水平,他们确实都是比较牛的人物,也是我的偶像,像夏昕写的spring,hibernate等都是非常难得的好书。

 

所以,是不是我用的是hibernate3.0,而书本中用的是hibernate2.0等原因造成的?很迷茫。

 

 

 

分享到:
评论

相关推荐

    Hibernate one-to-many / many-to-one关系映射

    在Hibernate的hbm.xml文件中,一对一关系通过&lt;one-to-one&gt;标签,一对多关系通过、、或标签来定义。需要详细指定实体类名、主键列名以及关联的外键列名。 2. 注解配置: 在实体类上直接使用@OneToOne、@OneToMany等...

    hibernate one-to-one 一对一唯一外键关联映射_单向 and 双向

    在Hibernate中,一对一唯一外键关联映射可以通过 `&lt;many-to-one&gt;` 标签来配置。例如,以下是Person实体与IdCard实体的一对一唯一外键关联映射配置: ```xml &lt;many-to-one name="idCard" column="card_id...

    (4)Hibernate中的many-to-one和one-to-many关系

    本话题主要探讨两种基本的关系映射类型:many-to-one(多对一)和one-to-many(一对多)。这两种关系映射是数据库中常见的关联类型,理解和掌握它们对于开发高质量的Java应用至关重要。 1. many-to-one关系 many-to...

    hibernate学习5之one-to-many双向关联.docx

    在配置双向一对多关联时,我们通常在"多"一端(这里是`Student`)的集合属性上使用`&lt;many-to-one&gt;`标签,将`Classes`对象映射到数据库中的外键。同时,在"一"端(`Classes`)使用`&lt;set&gt;`标签,表示班级可以包含多个...

    (3)Hibernate3.2 中的 one-to-one关系

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联是对象关系映射(ORM)中的一个重要概念,它用于表示两个实体之间一对一的映射关系。本篇将深入探讨Hibernate 3.2中的一对一关系,以及如何在实际项目中...

    Hibernate学习要点_one2one 一对一主键双线关联

    在深入探讨Hibernate中的一对一(One-to-One)主键双线关联机制之前,我们首先需要理解几个核心概念:Hibernate框架、实体关系映射以及主键关联的基本原理。Hibernate是Java平台下的一款开源对象关系映射(ORM)框架...

    Hibernate一对一主键关联映射(双向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是一种常见的关系数据库模型映射方式。这种关联通常发生在两个实体之间,且每个实体都只有一个对应的实例。本篇文章将详细探讨双向一对一主键关联映射...

    hibernate一对一主键关联映射(双项关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是一种常见的关系映射方式,用于表示两个实体之间一对一的对应关系。本篇主要探讨的是基于主键(Primary Key)的双向关联映射,这在实际项目中非常常见...

    hibernate一对一主键关联映射(单项关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是一种常见的关系数据库模型。本篇将深入探讨在Hibernate中实现一对一主键关联映射的单项关联方式。这种关联意味着两个实体类共享相同的主键,即一个...

    hibernate one-to-many 单/双向关联映射配置心得

    本文主要关注Hibernate中的一个核心概念——一对一(One-to-One)、一对多(One-to-Many)和多对一(Many-to-One)关联映射,特别是关于“一到多”单向和双向关联映射的配置心得。 首先,让我们了解“一到多”关联...

    hibernate使用主键关联的一对一关系

    在Java的持久化框架Hibernate中,一对一(OneToOne)关系是一种常见的对象关系映射(ORM)配置,用于表示两个实体类之间的一种唯一关联。在这个场景中,“hibernate使用主键关联的一对一关系”指的是通过共享主键来...

    Hibernate关联映射-one to one单向外键关联

    本话题主要探讨的是Hibernate中的一种关联映射方式——一对一(One-to-One)单向外键关联。这种关联模式通常用于两个实体之间存在唯一对应的关系,例如一个用户对应一个唯一的账户。 在Hibernate中,一对一关联可以...

    Hibernate 一对一关联映射(主键关联VS唯一外键关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系数据库模型。本篇文章将深入探讨两种实现一对一关联的方式:主键关联(Primary Key Join)和唯一外键关联(ForeignKey Join),并结合源码...

    Hibernate一对一主键关联映射(单向关联)

    在Java的持久化框架Hibernate中,一对一(One-to-One)关联映射是常见的关系映射方式之一,尤其在处理两个实体之间存在唯一对应关系时非常有用。本篇将重点讲解如何实现一对一主键关联映射的单向关联,并通过一个...

    Hibernate应用例子one-to-one

    在Hibernate中,"one-to-one"(一对一)关联是一种常见的关系映射类型,表示两个实体之间存在一对一的对应关系,就像一个人只能有一个护照,或者一辆车只能属于一个人一样。 一、一对一关系的配置 1. **注解配置**...

    Hibernate Tutorial 04 (Many-to-one and One-to-one Association

    #### 一、多对一关联(Many-to-One) 在本章中,我们将探讨如何在 Hibernate 中处理多对一关联。这种关联类型非常常见,在许多应用中都会遇到。例如,在一个在线书店应用中,每本书都与一个出版商关联,而一个出版...

    Hibernate-one-to-many

    同时,`Account.hbm.xml`中的`many-to-one`元素将`column`属性设置为`FID`,表示通过`FID`字段关联到`User`实体。 #### 测试场景解释 在测试场景中,我们创建了一个`User`对象和一个`Account`对象,并在`User`对象...

    深入浅出 Hibernate.pdf

    根据提供的标题“深入浅出 Hibernate.pdf”以及描述“深入浅出 Hibernate.pdf”,我们可以推断这份文档主要讲解了Hibernate框架的相关知识。接下来,我们将基于这些信息展开详细的解释与知识点的梳理。 ### ...

    Hibernate ORM - 一对一主键关联关系

    在一对一(One-to-One)主键关联关系中,两个实体类之间存在唯一对应的关系,通常一个实体对应另一个实体的一个实例,这种关系可以通过共享主键来实现。 在Hibernate中,一对一的主键关联关系可以通过以下几种方式...

    《深入浅出Hibernate》读书笔记

    《深入浅出Hibernate》这本书是关于Java ORM框架Hibernate的深度解析。读书笔记主要涉及了实体对象的生命周期、实体对象的识别以及数据缓存这三大核心概念。 首先,实体对象的生命周期是Hibernate中至关重要的概念...

Global site tag (gtag.js) - Google Analytics