相关文章
更多最近更新
更多关于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。
不知道代码什么地方有问题,望指点
相关问答
更多-
你如何在JPA中复制Hibernate的saveOrUpdate?(How can you replicate Hibernate's saveOrUpdate in JPA?)[2022-04-18]
尝试使用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或版本化,并且版本 ...
-
Hibernate saveOrUpdate(Hibernate saveOrUpdate)[2023-03-26]
我可以通过克隆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 ...
-
使用GeneratedValue对主键进行Hibernate SaveOrUpdate(Hibernate SaveOrUpdate using GeneratedValue for primary key)[2022-12-02]
这是预料之中的,因为您运行程序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 saveOrUpdate,update需要原始行的所有字段(Hibernate saveOrUpdate, update needs all fields of original row)[2022-03-06]
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查询以查找数据库中是否存在相 ...