关于hibernate的saveorupdate

SysUser和SysUserIM为one-to-one关系。
SysUser.hbm.xml代码如下

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
    
<hibernate-mapping>
    <class name="com.model.SysUser" table="TBL_SYS_USERS">
        <id name="userId" type="java.lang.String">
            <column name="USER_ID" length="40" />
            <generator class="native" />
        </id>
        <property name="userName" type="java.lang.String">
            <column name="USER_NAME" length="100" />
        </property>
        
        <one-to-one name="sysUserIM"
       class="com.model.SysUserIM"
       cascade="all" 
       />
    </class>
</hibernate-mapping>

 
SysUserIM.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="com.model.SysUserIM" table="TBL_SYS_USER_IM">
        <id name="userId" type="java.lang.String">
            <column name="USER_ID"/>
             <generator  class="foreign">
                 <param name="property">sysUser</param>
            </generator>
        </id>
        <property name="userName" type="java.lang.String">
            <column name="USER_NAME" length="100" />
        </property>
        <property name="userImage">
            <column name="USER_IMAGE" />
        </property>
        <one-to-one name="sysUser"  class="com.model.SysUser"
      constrained="true"
      />
    </class>
</hibernate-mapping> 

 

对应的java类 如下

SysUserIM sysUserIM=new SysUserIM();
sysUserIM.setUserImage(Hibernate.createBlob(bdata));
sysUserIM.setUserName(username);
sysUserIM.setSysUser(sysUser); sysuser是一个已经取得数据的对象 

 

持久类里执行代码如下

getHibernateTemplate().saveOrUpdate(sysUserIM);

 

 

我的问题是当sysUserIM里的userId不进行赋值的时候也就是为null的时候, 两次执行同一个userid的sql时 两次都是执行insert语句。
当 sysUserIM里的userId进行赋值的时候 两次执行同一个userid的sql时 两次都是执行update语句。
希望得到的结果是 第一次执行的时候为insert,第二次执行的时候 由于sysUserIM里已经含有了相同userid的数据 应该执行update。
不知道代码什么地方有问题,望指点

楼上的说得有些道理。

从你的配置来看,sysUser为主表,SysUserIM 为从表,
所以应该先这样写
SysUser sysUser=new SysUser();
SysUserIM im=new SysUserIM ();

sysUser.setSysUserIM(im);

getHibernateTemplate().saveOrUpdate(sysUser);

sysUser

这段配置的意思是SysUserIM的id是外键引用sysUser对象的,所以应该先保存主表SysUser.而先sysUser.setSysUserIM(im);这样的好处是HIBERNATE保存SysUser的过程 中发现一个有一个one-to-one关联的游离态属性后会自动将起保存。

你用saveOrUpdate的话应该设一下unsaved-value

这个是主从表对象搞错了,按你代码的意思就是SysUserIM 为主表,sysUser为从表,在SysUserIM.hbm.xml中为从表加CasCade这样就行了,

照你代码看是sysUser没有纳入Session管理

sysUser.setSysUserIM(im); 通常我连这句话也懒得写,我可以将SysUser表的sysUserIM属性像这样定义:sysUserIM=new SysUserIM(this);

而SysUserIM这边:
public SysUserIM(){}
public SysUserIM(SysUser sysUser){
this.sysUser=sysUser;
}

SysUserIM sysUserIM=new SysUserIM();

sysUserIM.setUserImage(Hibernate.createBlob(bdata));

sysUserIM.setUserName(username);

sysUserIM.setSysUser(sysUser); sysuser是一个已经取得数据的对象

这样你每次都是新的对象,当然是插入了.

第一次,插入
SysUserIM sysUserIM=new SysUserIM();

sysUserIM.setUserImage(Hibernate.createBlob(bdata));

sysUserIM.setUserName(username);

sysUserIM.setSysUser(sysUser);
第二次,更新
SysUserIM sysUserIM=getSysUserIm(id);//这个以ID取出sysuserim
sysUserIM.setUserImage(Hibernate.createBlob(bdata));

sysUserIM.setUserName(username);

sysUserIM.setSysUser(sysUser);