首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

hibernate的saveorupdate失灵

2013-02-15 
hibernate的saveorupdate失效saveorupdate()调用时候 如果ID为空会实现save方法来保存但是当我的ID不为空

hibernate的saveorupdate失效
saveorupdate()调用时候 如果ID为空会实现save方法来保存
但是当我的ID不为空时候  为什么就是不调用更新语句来更新 郁闷了很久 找不到原因
帮忙分析下


我的pojo一些代码

// Property accessors
@Id
@GeneratedValue(generator = "paymentableGenerator")    
@GenericGenerator(name = "paymentableGenerator", strategy = "identity") 
public Integer getId() {
return this.id;
}

public void setId(Integer id) {
this.id = id;
}

@OneToMany(mappedBy="user",fetch=FetchType.EAGER)
public Set<UserPermission> getUserPermissions() {
return userPermissions;
}

public void setUserPermissions(Set<UserPermission> userPermissions) {
this.userPermissions = userPermissions;
}

@OneToMany(mappedBy="user",fetch=FetchType.EAGER)
public Set<UserRole> getUserRoles() {
return this.userRoles;
}

public void setUserRoles(Set<UserRole> userRoles) {
this.userRoles = userRoles;
}

 我的web.xml 和事物的一些配置

<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class> 
<init-param>  
           <param-name>flushMode</param-name>  
           <param-value>AUTO</param-value>  
       </init-param> 
       <init-param>  
           <param-name>singleSession</param-name>  
           <param-value>true</param-value>  
       </init-param>  
   </filter>  
   
 <filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>

<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/j_acegi_security_check</url-pattern>
</filter-mapping>

<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping> 


<!--applicationContext的配置-->


 <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">    
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>    
   </bean> 
 
 <bean id="baseTransaction" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 
           abstract="true"> 
           
         <property name="transactionManager" ref="transactionManager"/> 
         <property name="proxyTargetClass" value="true"/> 


         <property name="transactionAttributes"> 
             <props> 
                 <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop> 
                  <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
                 <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
                 <prop key="save*">PROPAGATION_REQUIRED</prop> 
                 <prop key="add*">PROPAGATION_REQUIRED</prop> 
                 <prop key="update*">PROPAGATION_REQUIRED</prop> 
                 <prop key="remove*">PROPAGATION_REQUIRED</prop> 
                 <prop key="*">PROPAGATION_REQUIRED</prop> 
             </props> 
         </property> 
     </bean> 


 后台测试用的代码

public void save(Object o) {
System.out.println("xiaoxiao");
User user=(User) getHibernateTemplate().get(User.class, 55);
user.setName("xiaoxiao");
getHibernateTemplate().save(user);
System.out.println("------" + ((User)o).getId() + ((User)o).getPassword() +((User)o).getUsername());
getHibernateTemplate().save(o);
}

 打印的结果

xiaoxiao
Hibernate: select user0_.id as id7_4_, ..... from auth_user user0_ left outer join auth_userpermission userpermis1_ on user0_.id=userpermis1_.userid left outer join auth_permission permission2_ on userpermis1_.permissionid=permission2_.id left outer join auth_userrole userroles3_ on user0_.id=userroles3_.user_id left outer join auth_role role4_ on userroles3_.role_id=role4_.id where user0_.id=?
------63sds大时代
Hibernate: insert into auth_user (descn, name, password, status, username) values (?, ?, ?, ?, ?)

getHibernateTemplate().save(user); 我怎么改成saveorUpdate(user)也不行 不会调用update方法 这是为什么啊 !

[解决办法]
用saveorUpdate(user)是可以的,
但你要将user的id传递过来(从页面),然后后台ACTION会自动将这个ID注入到user中,然后才会判断是调用的save还是update
[解决办法]
你前台页面用的 EXT?
[解决办法]
我也碰到过 
逼的没办法 就只用SAVE 和UPDATE了
[解决办法]
用merge方法试试
------解决方案--------------------


 @OneToMany(mappedBy="user",fetch=FetchType.EAGER)
 修改为延迟 配置级联关系 试试
[解决办法]
save()最终会调用saveorUpdate()
而saveorUpdate()在你的id为NULL或者空的时候会insert一条记录,否则就是update。
debug一下,看看你的id是多少。
根据你的代码,user是update了,因为它是根据id(55)查询出来的,而object o就不一定了。
[解决办法]

引用:
用merge方法试试

merge 调的就是saveOrupdate

这个问题确实很诡异
别人工程里的可以 我每次saveOrUpdate 都是 insert 无论是否有主键ID值

热点排行