dstliang 2009-12-22 22:35
浏览 313
已采纳

关于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。
不知道代码什么地方有问题,望指点

  • 写回答

5条回答 默认 最新

  • Ryankay 2009-12-24 15:53
    关注

    楼上的说得有些道理。

    从你的配置来看,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关联的游离态属性后会自动将起保存。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 51寻迹小车定点寻迹
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题
  • ¥15 idea自动补全键位冲突
  • ¥15 请教一下写代码,代码好难
  • ¥15 iis10中如何阻止别人网站重定向到我的网站
  • ¥15 滑块验证码移动速度不一致问题
  • ¥15 Utunbu中vscode下cern root工作台中写的程序root的头文件无法包含