`
only_java
  • 浏览: 112414 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

hibernate中单向多对一的关联疑惑(管理员勿将帖子转到问答,那里不好交流)

阅读更多
本人初学hibernate,希望大家多多指教!
我假设person和card的多对一的关系(实际这两者的关系不是多对一)
他们对应的映射文件是:
person.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping schema="hibernatequickuse">
 <class name="mypack.person" table="person">
 <id name="id" column="id" type="java.lang.Integer">
  <generator class="identity"/>
 </id>
 <property name="name" column="name" type="java.lang.String" not-null="true"></property>
 <many-to-one name="mycard" column="card_id"  class="mypack.Card"  cascade="all"></many-to-one>
 </class>
</hibernate-mapping>

Card.hbm.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
  <class name="mypack.Card" table="card">
     <id name="id" column="ID" type="java.lang.Integer">
      <generator class="identity"/>
    </id>
    <property name="name" column="NAME" type="java.lang.String" not-null="true"></property>
  </class>
</hibernate-mapping>


假设当我们先把many-to-one中的cascade属性值去掉,改为:
<many-to-one name="mycard" column="card_id"  class="mypack.Card"  ></many-to-one>

然后执行如下代码:
  person p=new person();
	 p.setName("jack01");
	 Card c=new Card();
	 c.setName("card0031");
	 p.setMycard(c);
	 Session session=null;
	 Transaction tran=null;
	 try{
	     session=factory.openSession();
	     tran=session.beginTransaction();
              session.save(p);//为什么是update,而不是Insert
	     tran.commit();
             。。。。。。。
			    


执行结果本来应该会报一个异常,因为只持久化了person对象。而card是临时对象,所以当hibernate自动清理缓存中的持久化对象时会发现p引用了c临时对象,而在person表中对应的card_id字段值为0,这说明person持久化对象的状态和数据库的记录不一致,所以应该会抛出异常!但是它却并没有抛出异常,
而是插入了一条person记录,其card_id=0这是为什么???
Hibernate: insert into hibernatequickuse.person (name, card_id) values (?, ?)

当我把cascade="all"加上去之后,本来这时应该是先插入card记录,然后插入Person记录。但结果却是:
Hibernate: insert into hibernatequickuse.person (name, card_id) values (?, ?)
Hibernate: update card set NAME=? where ID=?

而且抛出异常,表示无法更新!这又是为什么????????
Exception executing batch: 
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

表结构如下:

-- 
-- 表的结构 `card`
-- 

CREATE TABLE `card` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(20) collate latin1_general_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=7 ;


CREATE TABLE `person` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(32) collate latin1_general_ci NOT NULL,
  `card_id` int(11) unsigned NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `card_id` (`card_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=4 ;


POJO如下:
person
package mypack;
public class person implements java.io.Serializable{
    private int id;
    private String name;
    private Card mycard;
    
   public person(){
    	
    }
    private void setId(int id){
    	this.id=id;
    }
    public void setName(String name){
    	this.name=name;
    }
    public void setMycard(Card mycard){
    	this.mycard=mycard;
    }
    public int getId(){
    	return this.id;
    }
    public String getName(){
    	return this.name;
    }
    public Card getMycard(){
      return this.mycard;
    }
    
}


Card
package mypack;

public class Card {
   private int id;
   private String name;
   
   public Card(){
	   
   }
   public void setId(int id){
	   this.id=id;
   }
   public void setName(String name){
	   this.name=name;
   }
   public String getName(){
	   return this.name;
   }
   public int getId(){
	   return this.id;
   }
}



分享到:
评论
6 楼 kakaluyi 2009-01-08  
那id生成方式改为assign的呢,自己分配id,如果还不行就是rp问题了
5 楼 only_java 2009-01-08  
kakaluyi 写道

我知道正常情况是可以,但是你好像card hbm.xml里面没有many to one,card不能setPerson那你觉得他们的关联关系由什么确定呢

谢谢你,card里面之所以没有many to one,是因为person和card是单向的多对一的关系!
4 楼 kakaluyi 2009-01-08  
我知道正常情况是可以,但是你好像card hbm.xml里面没有many to one,card不能setPerson那你觉得他们的关联关系由什么确定呢
3 楼 only_java 2009-01-07  
kakaluyi 写道

楼主你没有在数据库设置外键约束关系

可以不用设置外见约束关系吧?
2 楼 kakaluyi 2009-01-07  
楼主你没有在数据库设置外键约束关系
1 楼 only_java 2009-01-07  
补充下:我是参照网友的教程来做的,地址是:http://ryanpoy.iteye.com/blog/189783
奇怪的是他的结果是正确的!程序里面唯一不同的是我主键的设置上,我用的是auto_increment,映射xml中用的是identity!

相关推荐

    JSP开发之hibernate之单向多对一关联的实例

    JSP开发之hibernate之单向多对一关联的实例 一对多的基础上来测试单向多对一的关联 hibernate多对一的关联关系定义: 和单向一对多不同的是:一对多是在意的一方的一方定义set集合,在映射文件中 :单向多...

    Java中单表和多表级联的增删改查

    - 当两个或更多表之间存在关联时,例如一对多、多对一或多对多关系,级联操作会涉及到一个表的操作导致另一个表的相关数据也发生变化。例如,删除一个用户可能需要同时删除与之相关的所有订单。 - Hibernate等ORM...

    Java多线程编程环境中单例模式的实现

    ### Java多线程编程环境中单例模式的实现 #### 概述 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式的应用非常广泛,特别是在资源管理、日志记录、...

    MFC中单文档与多文档使用总结

    ### MFC中单文档与多文档使用总结 #### 重要概念与区别 MFC(Microsoft Foundation Classes)作为Visual C++中的一个重要的类库,提供了丰富的功能来帮助开发者快速构建Windows应用程序。在MFC中,单文档界面(SDI...

    浅析权限管理系统中单点登录

    而采用单点登录,管理员只需要在一个统一的用户管理系统中进行修改,信息会自动同步到所有接入系统,大大减少了重复劳动,提升了管理效率。 慧都UPMS通用用户权限系统针对这些挑战进行了升级,提供了一个用户权限...

    multisim中单相桥式PWM逆变电路的仿真

    在这个“multisim中单相桥式PWM逆变电路的仿真”项目中,我们将深入探讨如何利用Multisim来构建和分析一个基于IGBT(绝缘栅双极晶体管)的单相桥式脉宽调制(PWM)逆变电路。 首先,IGBT是一种电力电子开关元件,...

    两级供应链中单周期多产品的Stackberg博弈模型

    总体而言,两级供应链中单周期多产品的Stackberg博弈模型是研究供应链管理中决策问题的一个重要工具。它能够帮助生产商和零售商在面对需求不确定时,如何做出最优的订货和定价决策,从而优化整个供应链的效率和收益...

    SQL Server中单引号的两种处理技巧

    在SQL Server中,单引号(')是一个特殊字符,用于定义字符串常量。当在构建动态SQL语句时,如果查询条件中的变量包含了单引号,不进行特殊处理会导致SQL语法错误。以下是对标题和描述中所述知识点的详细解释: 1. ...

    Excel中单选钮的应用——制作单选题.pdf

    在Excel中,选项按钮是一种非常实用的控件,尤其在制作单选题或者进行多选项交互时。本教程主要介绍了如何利用Excel的选项按钮来创建一份单选题测试。以下是详细步骤: 1. **插入分组框**: 在创建单选题时,通常...

    对Angular中单向数据流的深入理解

    Angular 中单向数据流是指从组件树的顶部到底部渲染扫描过程中应用程序数据流转到由渲染过程生成的输出 DOM 数据结构的流程。Angular 认为所有的异步操作都有可能会引起模型的变化,引起数据模型发生变化的事件源有 ...

    行业文档-设计装置-一种在BS系统中单纸币钞箱交易处理方法.zip

    总的来说,"一种在BS系统中单纸币钞箱交易处理方法"涵盖了硬件设计、软件工程、数据管理、网络安全以及系统架构等多个IT领域的知识点。这个过程不仅需要深厚的理论基础,还需要实践经验和创新思维,以实现高效、安全...

    struts2中单文件,多文件上传

    以下将详细介绍如何使用Struts2来实现单文件和多文件上传。 首先,我们需要在Struts2的配置文件(通常为struts.xml)中添加关于文件上传的相关配置。这涉及到`struts.multipart.parser`属性的设置,用于指定处理...

    l中单高胜率英雄推荐.doc

    中单位作为每局游戏中的核心,其对胜利的贡献往往至关重要,因此在众多可选英雄中挑选一个胜率高的中单英雄,已成为许多玩家希望提高胜率的策略之一。 首先,胜率作为衡量英雄在比赛中的平均表现的数据,其重要性...

Global site tag (gtag.js) - Google Analytics