我用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的session Close后,运行,当要跳转到编辑个人信息页面时 报:session is closed。页面无法显示。郁闷 我session已经flush了
我已经在网上找了很多答案了 什么方法都有,都对照过 什么字段长度和数据库长度不符啊 什么的 我没有这个问题啊!
郁闷啊 学java学到这份上 我都没耐心了 难道java非要在这种框架上折腾时间吗?
解决方案 »
- STRUTS标签<logic:iterate>查数据为一条,复选框问题
- jfreechart 经典问题
- 通过自定义标签来调用函数出错,请高手帮忙!
- 为什么插入数据库中的中文为乱吗
- 该如何把这个String显示在网页上???
- 用weblogic和jbuilder2005开发一个项目,要从基础学起,谁能告诉我看哪些书能够较快上手?
- 急急急!!!高手指点,高分相送:打开ie页面的问题?
- unix下,可否运行Asp,如果可以,那么怎么配置!!
- 在用smartupload上处的时候如何改文件的名字呀
- 关于web和线程问题
- struts2 拦截器 和session 的存取问题 在线等
- struts2 spring jar 包 问题
public ActionForward doEdit(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)throws IOException{
PeopleForm peoForm = (PeopleForm) form;// TODO Auto-generated method stub
TPeople peopleInfo=peoForm.getPeoItem();//将form中的值 保存在个人实体类中
biz.updateSinglePeo(peopleInfo);//然后更新个人 TPeople people=biz.findPeoById(peopleInfo.getPeoId());//将跟新后的值再查询
request.setAttribute("peopleinfo", people);//保存在request中
return mapping.findForward("ShowEditPeople");//跳转到跟新后的页面
}hibernate 中的代码 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();
}
}
做的比较简单 大哥们帮我分析下
<property name="hibernate.connection.url">
jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=HR;user=aaa;password=aaa;
SelectMethod=cursor;
</property>
主要是加上SelectMethod=cursor;试试看
<property name="hibernate.connection.url">
jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=HR;user=aaa;password=aaa;
SelectMethod=cursor;
</property>
主要是加上SelectMethod=cursor;试试看
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.close();
我现在把更新的那段hibernate程序改掉了,不是全体更新,而是写一句hql语句,要修改什么 就更新什么,问题解决了:即执行一次更新可以运行不报错,但是运行第二次的更新就报org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update的错误。但是第二个问题还是如此,我断定是session的问题,继续深入浅出Hibernate,寻找问题的根由。
难道我在jsp里用了session来存储个人信息的缘故。但是此session非彼session啊!
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;
}
}添上一个简单的hibernate操作数据库的类,希望对你有帮助
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提供的解决方案): <!--为了避免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更新三个整型值,第一次提交 hibernate总是很快的完成并且前台立即更新到修改后的值,这里我使用request.getSession(true).setAttribute来保存更新数据,在页面之间传递数据的。为什么我在点一次修改,提交时hibernate运行超慢,过了一段时间后,出错了报:org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update。我***.hbm.xml都是手工写的,不存在网上说的什么把catlog=“***”的语句啊。”你所说的“第一次提交 hibernate总是很快的完成并且前台立即更新到修改后的值”,因为你用了会话技术(session,不是hibernate的session),当然“前台立即更新到修改后的值”了。因为不知道你代码到底是怎么写的,你说“为什么我在点一次修改,提交时hibernate运行超慢”,这个时候Console的打印信息是怎样的?特别是数据库操作语句打印出来的是什么
ps.你在hibernate.cfg.xml里的<session-factory>标签内加入<property name="show_sql">true</property>,这样就会每执行一个数据库操作,都会打印出数据库语句。
一般hibernate.cfg.xml的配置如下,仅作参考:<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/student</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property> <property name="connection.pool_size">1</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
</session-factory>
</hibernate-configuration>
你在更新的时候确定的你的PO是持久化状态还是游离状态 建议用 SAVAORUPDATE 方法试一试
你看看你的语句执行吧。错误提示:不能执行批处理你的session是实例变量,但是你每次调用一个方法执行后,都会关闭它;
当另一个方法使用时,一定会报错:session is closed。
解决办法:
1》在每一个数据库操作方法里,第一行加上PersonDBO方法。
即是每次使用现open个session,用完就关闭。
2》在每一个数据库操作方法里,去掉关闭session语句,另写一个方法执行关闭;在执行完所有操作后,一次性关闭。
另外33楼的做饭看起来不错。你可以试一试。
解决方案:
1. 不采用延迟加载,采用立即加载.
2. 自定义hibernate的事务处理,换句话说,自己去控制sessionFactory,对session进行open和close推荐第2种,第一种可能存在严重效率问题,但是第一种的操作简单,只需要修改下XML就OK了
我那时做的时候,没有用到spring,也没有涉及到hibernate的延时加载,三个框架也得慢慢来。
HibernateSessionFactory.getSession()
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:学东西要有耐心。
更新数据后跳转页面还是显示原来的,看来再好好看看hibernate了。
1、创建一个session,
2、打开Transaction,
3、处理业务
4、关闭transaction
5、关闭session