hibernate能打印出insert语句,但是数据库中没有更新数据啊!

hibernate能打印出insert语句,但是数据库中没有更新数据啊!能分析一下具体什么原因么?不行的话我在贴代码!!谢谢各位了~!

补充一下:我是在一个JSP页面里 两次调用HIBERNATE.UTIL的SAVE方法来实现数据更新的。前一条语句可以更新数据库,但是后一条可以打印出insert语句但是数据库没有更新。我是,请大家关照!
问题补充
来高人啊!
问题补充:
兄弟们,请看代码
SupplierDao.java
//////////////////////////
package com.supply.dao;

import java.util.List;
import org.hibernate.HibernateException;
import com.supply.dao.hibernate.HibernateUtil;
import org.hibernate.Session;
import com.supply.domain.Supplier;

public class SupplierDao{


public boolean saveSupplier(Supplier supplier)
{
try
{
Session savesu=HibernateUtil.currentSession();//取得SESSION
HibernateUtil.beginTransaction();        //开始事务
savesu.saveOrUpdate(supplier);                //保存
savesu.flush();
HibernateUtil.commitTrasaction();        //提交事务
HibernateUtil.closeSession();            //关闭SESSION
return true;
}
catch(HibernateException e)
{
System.out.print(e);
}
return false;
}

}
//////////////////////////////////////////
SuhistoryDao.java
////////////////////////////////////
package com.supply.dao;

import java.util.List;
import org.hibernate.HibernateException;
import com.supply.dao.hibernate.HibernateUtil;
import org.hibernate.Session;
import com.supply.domain.Supplier;
import com.supply.domain.Suhistory;;

public class SuhistoryDao {

public boolean addhistory(Suhistory suhistory){

try
{
Session addsu=HibernateUtil.currentSession();//取得SESSION
HibernateUtil.beginTransaction();        //开始事务
addsu.saveOrUpdate(suhistory);                //保存
addsu.flush();
HibernateUtil.commitTrasaction();        //提交事务
HibernateUtil.closeSession();            //关闭SESSION
return true;
}
catch(HibernateException e)
{
e.printStackTrace();
System.out.print(e);
return false;
}

}

}
////////////////////////
HibernateUtil.java
///////////////////////
package com.supply.dao.hibernate;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

public class HibernateUtil{

private static final SessionFactory sessionFactory;

static
{
try
{
sessionFactory=new Configuration().configure().buildSessionFactory();

}
catch(Throwable ex)
{
ex.printStackTrace();
System.out.println("Initial SessionFactory creation failed");
throw new ExceptionInInitializerError(ex);
}
}
public static final ThreadLocal tLocalsess=new ThreadLocal();

public static final ThreadLocal tLocaltx=new ThreadLocal();

public static Session currentSession()
{
Session session=(Session)tLocalsess.get();
try
{
//如果第一次使用,则创建一个新的SESSION
if(session==null||!session.isOpen())
{
//如果不是第一次使用,则打开一个SESSION
session=sessionFactory.openSession();
tLocalsess.set(session);
System.out.println("Session creation ok   ");
}
}
catch(HibernateException e)
{
e.printStackTrace();
}
return session;
}

public static void closeSession()
{
Session session=(Session)tLocalsess.get();
tLocalsess.set(null);
try
{
if(session!=null&&session.isOpen())
{
session.close();
System.out.println("session close ok  ");
}
}
catch(HibernateException e)
{
System.out.println("session close error!  ");
}

}

public static void beginTransaction()
{
Transaction tx=(Transaction)tLocaltx.get();
try
{
if(tx==null)
{
tx=currentSession().beginTransaction();
tLocaltx.set(tx);
System.out.println("Transaction ok   ");
}
}
catch(HibernateException e)
{
    System.out.println("Transaction error!  ");
}
}

public static void commitTrasaction()
{
Transaction tx=(Transaction)tLocaltx.get();
try
{
if(tx!=null&&!tx.wasCommitted()&&!tx.wasRolledBack())
{
tx.commit();
System.out.println("commit ok   ");
}
}
catch(HibernateException e)
{
    System.out.println("commit error   ");
}
}

public static void rollbackTransaction()
{
Transaction tx=(Transaction)tLocaltx.get();
try
{
tLocaltx.set(null);
if(tx!=null&&!tx.wasCommitted()&&!tx.wasRolledBack())
{
tx.rollback();
}
}
catch(HibernateException e)
{
}
}

private static Session openSession() throws HibernateException
{
return getSessionFactory().openSession();
}

private static SessionFactory getSessionFactory() throws HibernateException
{
return sessionFactory;
}
}
//////////////////////
gysZrSave.jsp
////////////////////////
<%@ page contentType="text/html; charset=utf-8" language="java"%>
<%@ page import="java.util.*"%>
<%@ page import="java.util.Date"%>
<%@ page import="java.sql.*"%>
<%@ page import="com.supply.dao.hibernate.*"%>
<%@ page import="com.supply.dao.hibernate.HibernateUtil"%>
<%@ page import="com.supply.domain.Supplier"%>
<%@ page import="com.supply.dao.*"%>
<%@ page import="com.supply.dao.SupplierDao"%>
<%@ page import="com.supply.common.FormatUtil"%>
<%@ page import="com.supply.dao.SuhistoryDao"%>
<%@ page import="com.supply.domain.Suhistory"%>

<%/////////////////////////////////////////////////%>
<%@page import="org.hibernate.*" %>
<%@page import="org.hibernate.cfg.*" %>
<%@page import="com.supply.domain.Supplier"%>
<%//////////////////////////////////////////////////%>

<% 



    //设置参数传递编码
   request.setCharacterEncoding("utf-8");
   
   String gysbm=request.getParameter("gysbm");
   String gyscs=request.getParameter("gyscs");
   String gysmc=request.getParameter("gysmc");
   float zczj=new Float(request.getParameter("zczj")).floatValue();
   String zcdz=request.getParameter("zcdz");
   String frdb=request.getParameter("frdb");
   String qyxz=request.getParameter("qyxz");
   String sfzhm=request.getParameter("sfzhm");
   String qylx=request.getParameter("qylx");
   String zzjg=request.getParameter("zzjg");
   String swdjh=request.getParameter("swdjh");
   String gskhh=request.getParameter("gskhh");
   String yhzh=request.getParameter("yhzh");
   String lxdz=request.getParameter("lxdz");
   String lxr=request.getParameter("lxr");
   String dhhm=request.getParameter("dhhm");
   //重复String gsdz=request.getParameter("gsdz");
   String gsyb=request.getParameter("gsyb");
   String gyszt=request.getParameter("gyszt");
   String gssf=request.getParameter("gssf");
   String zrsj=request.getParameter("zrsj");

            //数据初始化  
            SupplierDao supplierDao=new SupplierDao();
            Supplier sup=new Supplier();
            //保存数据
            sup.setGysbm(gysbm);
    sup.setGyscs(gyscs);
        sup.setGysmc(gysmc);
    sup.setZcdz(zcdz);
        sup.setZczj(zczj);
sup.setFrdb(frdb);
    sup.setSfzhm(sfzhm);
sup.setQyxz(qyxz);
    sup.setQylx(qylx);
sup.setZzjg(zzjg);
sup.setSwdjh(swdjh);
sup.setGskhh(gskhh);
sup.setYhzh(yhzh);
sup.setLxdz(lxdz);
sup.setLxr(lxr);
sup.setDhhm(dhhm);
//sup.setGsdz(gsdz);
    sup.setGsyb(gsyb);
sup.setGyszt(gyszt);
sup.setGssf(gssf);
sup.setZrsj(zrsj);

         if(supplierDao.saveSupplier(sup)){
        
         out.print("<script language='javascript'>") ;
         out.print("alert('供应商添加成功!');");
       
         out.print("</script>");
         }
           

  SuhistoryDao suhistoryDao=new SuhistoryDao();
  Suhistory suhistory=new Suhistory();
 
            suhistory.setGysbm("aaaaaaaa");
            suhistory.setSjsj("2002-1-1");
            suhistory.setSjmc("3");
            suhistory.setSjyy("32");
            suhistory.setSphy("32");
            suhistory.setBz("32");
           
         if(suhistoryDao.addhistory(suhistory)){
        
        out.println("供应商成功进入预选状态!");
         }        

   
%>


问题补充:
刚跟踪了一下。事件已经写了commit代码,但是好像没有执行。不知道其中原因。
问题补充:
我 已经修改为save(),但是还是没法更新数据库。

Transaction ok  
Hibernate:
    insert
    into
        supplier
        (gysmc, zcdz, zczj, frdb, sfzhm, qyxz, qylx, zzjg, swdjh, gskhh, yhzh, lxdz, lxr, dhhm, gsdz, gsyb, gyszt, gssf, zrsj, yxsj, zzsj, qtsj, gysbm, gyscs)
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
commit ok  
session close ok 
Session creation ok  
Hibernate:
    select
        max(id)
    from
        suhistory
Hibernate:
    insert
    into
        suhistory
        (gysbm, sjsj, sjmc, sjyy, sphy, bz, id)
    values
        (?, ?, ?, ?, ?, ?, ?)
session close ok 
问题补充:
从上面可以看出,COMMIT确实没有提交,就直接关闭SESSION了,但是我不知道为什么会这样啊。
谢谢各位的耐心解答。不甚感谢!!!
问题补充:
刚看到 第二次不但 事件没提交 连Transaction 都没有执行!天啦。已经困扰我两天了!
问题补充:
saveOrUpdate方法跟主键有关

你的pojo类对应的xml文件里指定了主键即<id>标签

hibernate执行saveOrUpdate方法时 看你的主键 没有的话 他就什么都不执行了

saveOrUpdate(obj)你的保证obj里你set了你指定成主键那个属性。

如果缓存里有了这个主键他就update了 没有就insert了


谢谢大哥,我已经将saveOrUpdate()修改为 save()了 执行后成上面的结果!

11个回答

你的HibernateUtil类有问题,第一次事务提交后,没有将tLocaltx.set(null);导致第二次beginTransaction()失败,因此第二次导入没有提交。你把commitTrasaction()方法代码改一下:

[code="java"]
public static void commitTrasaction() {
Transaction tx = (Transaction) tLocaltx.get();
try {
if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {
tx.commit();
[color=red]tLocaltx.set(null);[/color]
System.out.println("commit ok ");
}
} catch (HibernateException e) {
System.out.println("commit error ");
}
}
[/code]

如果都已经打印出insert语句的话,那应该是要插入进去,但也有可能回滚了插入操作

你仔细看看代码,跟踪调试下吧

应该是事务没有提交。

看看代码有没有commit

[quote]前一条语句可以更新数据库,但是后一条可以打印出insert语句但是数据库没有更新[/quote]
查查这段代码看看,第一条跟第二条有什么区别吗,没COMMIT还是其他什么原因..

你用的是saveOrUpdate,如果主键已存在,则只做update,不会新insert一条记录。

saveOrUpdate方法跟主键有关

你的pojo类对应的xml文件里指定了主键即标签

hibernate执行saveOrUpdate方法时 看你的主键 没有的话 他就什么都不执行了

saveOrUpdate(obj)你的保证obj里你set了你指定成主键那个属性。

如果缓存里有了这个主键他就update了 没有就insert了

看得我眼睛都花了,你的代码有问题,这个与saveOrUpdate方法没有关系。仔细检查一下代码,特别是HibernateUtil这个类

我感觉你这就是主键的问题,跟方法没有关系(saveOrUpdate和save查不多)

save(sup) 你的sup里面 封装主键了吗(你的sup对象一定是对应一张表吧,这个表有主键吧,你的sup.hbm.xml里面有指定
[code="java"]




[/code])
这个东西吧!

你的sup一定没有set 这个属性吧 (你sup对象对应一张表的id属性)
hibernate都是操作主键的 没有主键 啥也干不了地

你的commitTrasaction() 方法有问题,应该像closeSession() 那样处理,把
ThreadLocal tLocaltx提交清空一下。
public static void commitTrasaction()
{
Transaction tx=(Transaction)tLocaltx.get();
[b]tLocaltx.set(null); [/b]
try
{
if(tx!=null&&!tx.wasCommitted()&&!tx.wasRolledBack())
{
tx.commit();
System.out.println("commit ok ");
}
}
catch(HibernateException e)
{
System.out.println("commit error ");
}
}

共11条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问