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条)

报告相同问题?

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效