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);
这段配置的意思是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);