用hibernate 查询数据为修改前的数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用hibernate 查询数据为修改前的数据相关的知识,希望对你有一定的参考价值。
我有两个表一个是分类表,一个是版面表,它们的关系是一对N的关系,当我对版面表用hibernate来插入删除数后再查询所有信息为插入数据前的数据,只有当重新布属下应用再查时才能显出所插入,删除后的数据。但是对分类表进行相应的增删改查操作后都能显示出所有新数据,
下面的是分类对应的Action中的查询所有数据的方法:
public ActionForward list(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception
List<Category> categorys = cs.findAll();
for(Category c:categorys)
System.out.println(c.getName()+": :"+c.getOrder());
Set<Forum>forums = c.getForums();
for(Forum f:forums)
System.out.println(f.getName()+":"+f.getOrder());
request.setAttribute("categorys", categorys);
return mapping.findForward("list");
下面是版面表对应的Action的插入方法:
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception
if(validateFailed(form,mapping,request)) //自己验证formbean
return addUI(mapping,form,request,response);
ForumForm ff = (ForumForm)form;
Forum f = new Forum();
Category c = cas.getCategory(ff.getCategoryId());
f.setName(ff.getName());
//f.setOrder(f.getOrder());
f.setCategory(c);
cs.addForum(f);
return mapping.findForward("showCategory");
下面是两个action在struts-config.xml中的配置
<!-- 分类管理 -->
<action path="/category" type="cn.itcate.web.struts.action.CategoryAction"
scope="request" parameter="method" validate="false" name="categoryForm">
<forward name="list" path="/WEB-INF/jsp/category/list.jsp" />
<forward name="addUI" path="/WEB-INF/jsp/category/addUI.jsp" />
<forward name="showCategory" path="/category.do?method=list" redirect="true"/>
</action>
<!-- 版面管理 -->
<action path="/forum" type="cn.itcate.web.struts.action.ForumAction"
scope="request" parameter="method" validate="false" name="forumForm">
<forward name="addUI" path="/WEB-INF/jsp/forum/addUI.jsp" />
<forward name="showCategory" path="/category.do?method=list" redirect="true"/>
</action>
注:session 和事务都是在过滤器中控制,并且在调用list()这个方法时事务已经提交,session 也已经关闭了。
下面的是过滤器中打印出的在add()方法重定项到list()方法时事务和session的关闭和开启的情况:
HibernateSessionFilter commit success
HibernateSessionFilter begin close session
*********HibernateSessionFilter close session success*********
----当前时间:2010-03-24 时间 --00:21:12----
----------HibernateSessionFilter start-----------
HibernateSessionFilter begin transaction
Hibernate: select category0_.id as id1_, category0_.name as name1_, category
也就是说inverse问题
也就是谁来维护一对N的关系问题
如果一端inverse为false,那么由一端来维护关系
也就是一端的Set中,add(多端对象)(前提是这些多端对象数据库已经有记录)
那么,这样的保存有效,
而多端add(一端对象),这样无效,因为这里是一端 来 维护一对N关系
如果一端inverse为true
那么一端的Set add(多端),无效
多端 add(一端),有效,因为这时是多端维护关系了 参考技术B 好久没用过hibernate了 不过看你的问题 感觉是 你添加数据之后没有更新 categorys 这个list 如果数据确实是插入了 那么就肯定是同步问题了本回答被提问者采纳
hibernate query.list() 返回的数据类型
在hibernate中,用hql语句查询实体类,采用list方法的返回结果为一个List,该List中封装的对象分为以下三种情况:
1.查询全部字段的情况下,如"from 实体类",list中封装的对象为实体类本身,各属性都将得到填充。
String hql = " from Commodity "; Query query = session.createQuery(hql); List<Commodity> commodities = query.list(); for(Commodity c : commodities){ System.out.println("name:"+c.getName()); System.out.println("seller‘s name :"+c.getSeller().getName());
2.只查询一个字段,默认情况下,list中封装的是Object对象。
String hql = " select s.name from Seller s "; Query query = session.createQuery(hql); List<Object> list = query.list(); for(Object obj : list){ System.out.println("name:"+obj); }
3.查询两个或两个以上的字段,默认情况下,list中封装的是Object[],长度与所查询的字段数一致。
String hql = " select c.name,c.tel,c.age from Customer c "; Query query = session.createQuery(hql); List<Object[]> list = query.list(); for(Object[] objs : list){ System.out.println("name:"+objs[0]); System.out.println("tel:"+objs[1]); System.out.println("age:"+objs[2]); }
对于后两种情况,用标签遍历时不太方便,因为无法直接转换成实体类的对象。
比较简单的解决方法是:在hql中使用 select new 包名.类名(属性1,属性2……) from 实体类,
同时在实体类中添加带参的构造方法,参数的个数和顺序与(属性1,属性2……) 保持一致,
这样我们得到的list中存放的依然是实体类的对象,所查询到的属性得到了填充,使用起来更为方便。
以上是关于用hibernate 查询数据为修改前的数据的主要内容,如果未能解决你的问题,请参考以下文章
hibernate级联修改之后接着查询时,查不出来?,用hibernate做的返回对象为null,求解