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 调的就是saveOrupdate
这个问题确实很诡异
别人工程里的可以 我每次saveOrUpdate 都是 insert 无论是否有主键ID值