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

struts+hibernate的有关问题

2012-02-11 
struts+hibernate的问题我用hibernate更新三个整型值,第一次提交 hibernate总是很快的完成 并且前台立即更

struts+hibernate的问题
我用hibernate更新三个整型值,第一次提交 hibernate总是很快的完成 并且前台立即更新到修改后的值,这里我使用request.getSession(true).setAttribute来保存更新数据,在页面之间传递数据的。为什么我在点一次修改,提交时hibernate运行超慢,过了一段时间后,出错了 报:org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update。我***.hbm.xml都是手工写的,不存在网上说的什么把catlog=“***”的语句啊。
还有一个问题是:我的另一个页面要修改个人信息,比如邮箱,昵称,我点修改,数据库保存了 那为什么前台还是显示原来的呢,我把hibernate的session Close后,运行,当要跳转到编辑个人信息页面时 报:session is closed。页面无法显示。郁闷 我session已经flush了
我已经在网上找了很多答案了 什么方法都有,都对照过 什么字段长度和数据库长度不符啊 什么的 我没有这个问题啊!
  郁闷啊 学java学到这份上 我都没耐心了 难道java非要在这种框架上折腾时间吗?

[解决办法]
那你在hibernate.cfg.xml配置文件里面连接数据库改成
<property name="hibernate.connection.url">
jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=HR;user=aaa;password=aaa;
SelectMethod=cursor;
</property>
主要是加上SelectMethod=cursor;试试看
[解决办法]
public void update(TPeople peoInfo){
Transaction tx=null;
session=sf.openSession();
try{
tx=session.beginTransaction();
session.update(peoInfo);
tx.commit();
}catch(Exception ex){
if(tx!=null){tx.rollback();}
ex.printStackTrace();
}finally{

session.flush();

}
}

你写程序怎么不关的啊,关掉就没事了
[解决办法]
session.flush();

----》
session.close();
[解决办法]
楼主不要急躁,你现在遇到问题总比你以后工作了再遇到同样的问题好。
[解决办法]

Java code
package com.sunyard.DBO;import java.util.Iterator;import java.util.List;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.Transaction;import org.hibernate.cfg.Configuration;import com.sunyard.bean.Person;/* * 具体操作Hibernate的类 * 增加、删除、修改、按ID查询、模糊查询、查询全部操作 */public class PersonDBO {        //在Hibernate中,所有的操作都是在Session中完成    //此Session不同于JSP中的Session    private Session session=null;         //在构造方法中实例化Session对象    public PersonDBO(){        //找到Hibernate配置        Configuration config=new Configuration().configure();        //从配置中取出SessionFactory        SessionFactory factory=config.buildSessionFactory();        //从SessionFactory中取出一个Session        this.session=factory.openSession();    }        //所有的操作都是通过session进行的    //插入    public void insert(Person p){        //打开事务        Transaction tran=this.session.beginTransaction();        //执行插入语句        this.session.save(p);        //提交事务        tran.commit();        this.session.close();    }        //更改    public void update(Person p){        //打开事务        Transaction tran=this.session.beginTransaction();        //执行插入语句        this.session.update(p);        //提交事务        tran.commit();        this.session.close();    }        //按ID查询 推荐用HQL    public Person queryById(String id){        Person p=null;        //使用Hibermate查询语句        String hql="from Person as p where p.id=?";        //通过Query接口查询        Query q=this.session.createQuery(hql);        q.setString(0,id);        List l=q.list();        Iterator iter=l.iterator();        if(iter.hasNext()){            p=(Person)iter.next();        }        this.session.close();        return p;    }        //删除1    //使用此方法删除数据之前,必须先查找到数据对象,性能会打折    public void delete(Person p){        //打开事务        Transaction tran=this.session.beginTransaction();        //执行插入语句        this.session.delete(p);        //提交事务        tran.commit();        this.session.close();    }        //根据HQL的语句进行了修改,增加了删除指令    public void delete(String id){                Transaction tran=this.session.beginTransaction();        String hql="delete Person where id=?";        Query q=this.session.createQuery(hql);        //设置参数        q.setString(0, id);        //执行更新语句        q.executeUpdate();        tran.commit();        this.session.close();    }        //查询全部数据,写HQL    public List queryALL(){        List l=null;        String hql="from Person as p";        Query q=this.session.createQuery(hql);        l=q.list();        this.session.close();        return l;    }        //模糊查询    public List queryByLike(String cond){        List l=null;        String hql="from Person as p where p.name like ?";        Query q=this.session.createQuery(hql);        q.setString(0, "%"+cond+"%");        l=q.list();        this.session.close();        return l;    }    } 


[解决办法]
多学点设计模式吧!支持
[解决办法]
session没有关闭,可能是同一持久化对象在不同事务操作引起的,简单说是状态管理错误
[解决办法]
建议LZ再结合spring,要spring支持hibernate的HibernateTemplate来管理你的session什么的,省去很多事..
[解决办法]
建议你就用类似16楼的那种写法:
1、创建一个session,
2、打开Transaction,
3、处理业务
4、关闭transaction
5、关闭session

这样感觉既清晰,又有条理。
[解决办法]
楼主你的表达能力还不是很强,特别是涉及到这些操作的代码以及错误的完整代码没贴出来(只是贴了部分,不全)。
总得来说,问问题的人没说不明白,导致回答问题的人只好去猜测问题所在。
建议楼主把你的问题涉及到的代码统一贴出来,包括hbm、hibernate.cfg.xml的代码,因为Hibernate有lazy策略,你没贴出来,谁知道你到底是怎么配置的。

对于“还有一个问题是:我的另一个页面要修改个人信息,比如邮箱,昵称,我点修改,数据库保存了那为什么前台还是显示原来的呢,我把hibernate的session Close后,运行,当要跳转到编辑个人信息页面时 报:session is closed。页面无法显示。郁闷 我session已经flush了”
我不知道你有没有用到Spring,如果用到,在web.xml加入OpenSessionInView,这个就是为了解决你前台比如jsp页面读取数据库时session关闭的问题,原因就在于:你在业务操作时关闭了session,等到你转向页面想读取数据时,由于session被关闭,当然就读不出来报session is closed了。
web.xml加入OpenSessionInView配置如下(此处为Spring提供的解决方案):

XML code
    <!--为了避免Hibernate懒加载异常而创建的解决方案  -->    <filter>        <filter-name>hibernateFilter</filter-name>        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>    </filter>        <filter-mapping>        <filter-name>hibernateFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>
[解决办法]
你的hibernate管理session没管理好,我记得有一个多表连接操作的时候有一个 什么属相要设置一下,如果没有设置老是报session没有关闭错误,第一次运行的很好,第二次就不行了,你在网上查查看,就是hibernate自动生成的文件中的一个属相
[解决办法]
路过看看,相信楼主已经解决啦!祝你早日找到好工作!
[解决办法]
Could not execute JDBC batch update
你看看你的语句执行吧。错误提示:不能执行批处理

你的session是实例变量,但是你每次调用一个方法执行后,都会关闭它;
当另一个方法使用时,一定会报错:session is closed。
解决办法:
1》在每一个数据库操作方法里,第一行加上PersonDBO方法。
即是每次使用现open个session,用完就关闭。
2》在每一个数据库操作方法里,去掉关闭session语句,另写一个方法执行关闭;在执行完所有操作后,一次性关闭。


另外33楼的做饭看起来不错。你可以试一试。
[解决办法]
典型的hibernate事务处理问题,原因是你在做查询的时候可能嵌套了一个查询,所以第二个查询结束后session关闭,如果还要继续使用第一个查询的级联映射就会产生问题.
解决方案: 
1. 不采用延迟加载,采用立即加载.
2. 自定义hibernate的事务处理,换句话说,自己去控制sessionFactory,对session进行open和close

推荐第2种,第一种可能存在严重效率问题,但是第一种的操作简单,只需要修改下XML就OK了
[解决办法]
专门写一个对session打开和关闭的类,这样在以后类引用中会省很多事的,大家共同分享下:
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class HibernateUtil {
private static final SessionFactory sessionFactory;
static {
try {
// Create the SessionFactory
sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (Throwable ex) {
ex.printStackTrace();
throw new ExceptionInInitializerError(ex);
}
}

public static final ThreadLocal tread = new ThreadLocal();

public static Session openSession() throws HibernateException {
Session session = (Session) tread.get();
// Open a new Session, if this Thread has none yet


if (session == null||!session.isOpen()) {
session = sessionFactory.openSession();
tread.set(session);
}
return session;
}

public static void closeSession() throws HibernateException {
Session s = (Session) tread.get();
tread.set(null);
if (s != null)

s.close();
}
}
[解决办法]
是不是这样:
你每次访问数据库的时候都在new一个session,应该在HibernateSessionFactory里获取一个session,有工厂统一管理session.
这样就不用每次操作都要创建一个session,然后销毁session.当创建过多的session,又长时间没有销毁,也会出现问题的。

PS:学东西要有耐心。

热点排行