hibernate的saveorupdate失效

pingqunnayang 2010-09-20 10:57:07
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方法 这是为什么啊 !
...全文
568 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
_还行_ 2013-02-01
  • 打赏
  • 举报
回复
引用 10 楼 pingqunnayang 的回复:
没有执行update语句 数据库数据也没更改
我跟你的错误一样,正在寻找解决办法。
pingqunnayang 2010-09-21
  • 打赏
  • 举报
回复
折腾了2天 找到了问题所在 但是没有什么解决方案
问题出在 openSesssionviewFilter 上 我之前是

<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>

这样配置的 这样配置不能update 和delete 但是可以insert
于是我怀疑是

<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>

他的问题 我把这段删除后 在查找时候不报异常 save update delete的时候都报

org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.
org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1186)
org.springframework.orm.hibernate3.HibernateTemplate$14.doInHibernate(HibernateTemplate.java:718)
org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:716)
org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:712)
com.xiao.zblogsystem.security.action.UserAction.modify(UserAction.java:54)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
.....

如下异常

于是我就尝试着把opensessionviewfilter的web.xml的配置删除了去, 这时候我再运行就没问题
svae update delete 都能运行
现在就不知道openSessionviewfilter 要怎么配置了 我用的是 ssh2 spring annotation 和 hibernate annotation 谁能给个配置参考下 谢谢了!
pingqunnayang 2010-09-20
  • 打赏
  • 举报
回复
高手快帮看下......卡住了我好几天
zn85600301 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xianaofei 的回复:]

用merge方法试试
[/Quote]
merge 调的就是saveOrupdate

这个问题确实很诡异
别人工程里的可以 我每次saveOrUpdate 都是 insert 无论是否有主键ID值
pingqunnayang 2010-09-20
  • 打赏
  • 举报
回复
没有执行update语句 数据库数据也没更改
不能飞的肥燕 2010-09-20
  • 打赏
  • 举报
回复
save()最终会调用saveorUpdate()
而saveorUpdate()在你的id为NULL或者空的时候会insert一条记录,否则就是update。
debug一下,看看你的id是多少。
根据你的代码,user是update了,因为它是根据id(55)查询出来的,而object o就不一定了。
pingqunnayang 2010-09-20
  • 打赏
  • 举报
回复
貌似一样

System.out.println("xiaoxiao22merger");
System.out.println(getHibernateTemplate().getFlushMode());
User user=(User) getHibernateTemplate().get(User.class, 55);
user.setName("xiaoxiao");
getHibernateTemplate().merge(user);
System.out.println(((User)o).getId() + ((User)o).getPassword() +((User)o).getUsername());
getHibernateTemplate().save(o);

结果

xiaoxiao22merger
1
Hibernate: select user0_.id as id7_4_, user0_.descn as descn7_4_, user0_.name as name7_4_, user0_.password as password7_4_, user0_.status as status7_4_, user0_.username as username7_4_, userpermis1_.userid as userid6_, userpermis1_.id as id6_, userpermis1_.id as id8_0_, userpermis1_.permissionid as permissi2_8_0_, userpermis1_.userid as userid8_0_, permission2_.id as id2_1_, permission2_.descn as descn2_1_, permission2_.name as name2_1_, permission2_.operation as operation2_1_, permission2_.status as status2_1_, userroles3_.user_id as user3_7_, userroles3_.id as id7_, userroles3_.id as id9_2_, userroles3_.role_id as role2_9_2_, userroles3_.user_id as user3_9_2_, role4_.id as id5_3_, role4_.descn as descn5_3_, role4_.name as name5_3_ 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=?
71d 的
Hibernate: insert into auth_user (descn, name, password, status, username) values (?, ?, ?, ?, ?)

madFatso 2010-09-20
  • 打赏
  • 举报
回复
@OneToMany(mappedBy="user",fetch=FetchType.EAGER)
修改为延迟 配置级联关系 试试
pingqunnayang 2010-09-20
  • 打赏
  • 举报
回复
由于对hiberntate annotation 不是很熟悉 想问下是不是这方面的原因

还是 事物方面 read-only的问题

之前在在调用save方法的时候会报read-only问题 后面网上说是 opensessionviewfilter的问题 就加了
<init-param>
<param-name>flushMode</param-name>
<param-value>AUTO</param-value>
</init-param>
这段配置
xianaofei 2010-09-20
  • 打赏
  • 举报
回复
用merge方法试试
zn85600301 2010-09-20
  • 打赏
  • 举报
回复
我也碰到过
逼的没办法 就只用SAVE 和UPDATE了
pingqunnayang 2010-09-20
  • 打赏
  • 举报
回复
不是 easyUI 单是这句总有Id吧?
User user=(User) getHibernateTemplate().get(User.class, 55);
user.setName("xiaoxiao");
getHibernateTemplate().saveorupdate(user);

他也不打印update 不知道是什么配置有问题
zn85600301 2010-09-20
  • 打赏
  • 举报
回复
你前台页面用的 EXT?
tianshi1017 2010-09-20
  • 打赏
  • 举报
回复
用saveorUpdate(user)是可以的,
但你要将user的id传递过来(从页面),然后后台ACTION会自动将这个ID注入到user中,然后才会判断是调用的save还是update

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧