关于hibernate的saveorupdate

2019-03-25 13:37|来源: 网路

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

相关问答

更多
  • 尝试使用EntityManager.merge方法 - 这非常相似。 Xebia的博文中有不同的描述:“ JPA实施模式:保存(分离)实体” 。 Try using the EntityManager.merge method - this is very similar. There is an excellent description of the differences in Xebia's blogpost: "JPA Implementation Patterns: Saving (Detach ...
  • 当您使用.saveOrUpdate() Hibernate将检查对象是否是临时的(它没有标识符属性),如果是这样,它将通过生成标识符并将其分配给会话来使其持久化。 如果对象已经有一个标识符,它将执行.update() 。 从文档 : saveOrUpdate()执行以下操作: 如果该对象在此会话中已经持久化,则不执行任何操作 如果与会话关联的另一个对象具有相同的标识符,则抛出异常 如果对象没有标识符属性,则保存()它 如果对象的标识符具有分配给新实例化对象的值,则save() 如果对象被a或版本化,并且版本 ...
  • 我可以通过克隆java对象来使用指定的方法。 table1是克隆来创建新的table2对象。 但这是一个非常复杂的过程,涉及多个* -to-Many关系。 后来我尝试使用XML方法在hibernate中定义表。 请参阅 将相同的POJO映射到Hibernate XML映射文件中的多个表以获取详细信息。 请注意,在其他数据库操作中使用session之前,您可能需要使用session.clear()来解析实体。 任何其他方法都将受到欢迎。 在这种情况下,克隆不需要,因为我们正在定义基于相同Java对象的表。 问 ...
  • saveOrUpdate()操作的语义如下(参见11.7。自动状态检测 ): 如果对象在此会话中已经持久化,则不执行任何操作 如果与会话关联的另一个对象具有相同的标识符,则抛出异常 如果对象没有标识符属性,则保存()它 如果对象的标识符具有分配给新实例化对象的值,则保存()它 如果对象是由or版本化的,并且version属性值是分配给新实例化对象的相同值,则save()它 否则更新()对象 因此,在导入XML文件期间看起来主键或版本值会丢失。 Semantics of saveOrUpdate() oper ...
  • 这是预料之中的,因为您运行程序2次。 每次程序运行时,Hibernate只会看到你传入3个新实体(没有ID),因此你告诉Hibernate在DB中创建新记录。 要查看saveAndUpdate()的效果,您可以在第二次将分离的实例传递给Hibernate,例如,具有ID的TestCaseData实例对应于DB中的现有记录,但具有不同的name 。 您应该能够看到Hibernate更新DB中的相应记录。 It is expected, because you are running the program 2 ...
  • 它将更新现有记录(如果存在于DB else中)它将使用BI的ADDRESS_TYPE创建新记录。 请参阅hibernate文档链接 。 It will update the existing record if exist in DB else It will create new record with ADDRESS_TYPE of BI. Refer hibernate documentation link.
  • Hibernate无法弄清楚你想要如何处理具有null值的属性。 在以下情况之间无法区分: 某些属性为null - >应在数据库中设置为null 某些属性为null - >不应更新此类属性。 将先前为非null的属性的值设置为null意味着应更改属性的值。 如果要使列永远不属于update语句,可以在@Column批注中将updatable属性设置为false。 根据它定义的文档: 该列是否包含在由持久性提供程序生成的SQL UPDATE语句中 Hibernate cannot figure out how ...
  • 试着看一下Spring的HibernateTemplate.saveOrUpdate。 它具有与required.bieng开源相同的功能,你可以看到代码以及实现 try having a look at HibernateTemplate.saveOrUpdate from Spring . it has the same functionality as required.bieng open source you may see the code as well for implementation
  • 对于每个saveOrUpdate操作,Hibernate也会生成一个select语句。 在我看来,使用Hibernate的saveOrUpdate更新或插入大量数据根本不是一个好选择。 我建议使用存储过程或移动到SpringJDBCTemplate。 For every saveOrUpdate operation Hibernate generates a select statement as well. In my opinion updating or inserting huge data usi ...
  • 根据StatelessSession JavaDoc 无状态会话不实现第一级高速缓存,也不与任何二级高速缓存交互,也不实现事务性后写或自动脏检查,也不操作级联到关联实例。 无状态会话将忽略集合。 通过无状态会话执行的操作绕过Hibernate的事件模型和拦截器。 由于缺少第一级缓存,无状态会话容易受到数据别名影响 它不维护第一级缓存,因此不知道对象的当前状态(Transient,Persistent,Detached或Removed),因此无法做出有意识的决定。 您可以使用HQL查询以查找数据库中是否存在相 ...