今天在MySQL中用hibernate测试update语句发现以下问题: update语句竟然不去作用; 表机构如下: create table student update语句如下: String[] params = new String[] { "20", "成龙" }; HibernateUtil.executeUpdate(
package com.huml.util; import java.util.ArrayList; import java.util.Arrays; import org.hibernate.Transaction; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static final SessionFactory sf; private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); static { sf = new Configuration().configure().buildSessionFactory(); } private HibernateUtil() { } public static Session openSession() { return sf.openSession(); } public static Session getcurrentSession() { Session session = threadLocal.get(); if (session == null) { session = sf.openSession(); threadLocal.set(session); } return session; } public static void save(Object obj) { Session session = openSession(); Transaction tx = null; try { tx = session.beginTransaction(); session.save(obj); tx.commit(); } catch (Exception e) { if (tx != null) { tx.rollback(); } throw new RuntimeException(e.getMessage()); } finally { if (session != null && session.isOpen()) { session.close(); } } } @SuppressWarnings("unchecked") public static ArrayList executeQuery(String hql, String... params) { Session session = openSession(); Transaction tx = null; ArrayList list = null; try { tx = session.beginTransaction(); Query query = session.createQuery(hql); if (params != null && params.length > 0) { for (int i = 0; i < params.length; i++) { query.setParameter(i, params[i]); } } list = (ArrayList) query.list(); tx.commit(); } catch (Exception e) { if (tx != null) tx.rollback(); throw new RuntimeException(e.getMessage()); } finally { if (session != null && session.isOpen()) { session.close(); } } return list; } public static void executeUpdate(String hql, String... params) { Session session = openSession(); Transaction tx = null; try { tx = session.beginTransaction(); Query query = session.createQuery(hql); if (params != null && params.length > 0) { for (int i = 0; i < params.length; i++) { query.setParameter(i, params[i]); // System.out.println("query influenced: "+params[i]); } } System.out.println("query influenced: " + query.getQueryString()); int n = query.executeUpdate(); System.out.println("query influence: " + n); tx.commit(); } catch (Exception e) { if (tx != null) tx.rollback(); throw new RuntimeException(e.getMessage()); } finally { if (session != null && session.isOpen()) { session.close(); } } } } 原因是MySQL中不能自动把String类型转换成Integer,在Oracle中可以修改代码如下: Object[] params = new Object[] { 20, "成龙" }; HibernateUtil.executeUpdate( package com.huml.util; import java.util.ArrayList; import java.util.Arrays; import org.hibernate.Transaction; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static final SessionFactory sf; private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); static { sf = new Configuration().configure().buildSessionFactory(); } private HibernateUtil() { } public static Session openSession() { return sf.openSession(); } public static Session getcurrentSession() { Session session = threadLocal.get(); if (session == null) { session = sf.openSession(); threadLocal.set(session); } return session; } public static void save(Object obj) { Session session = openSession(); Transaction tx = null; try { tx = session.beginTransaction(); session.save(obj); tx.commit(); } catch (Exception e) { if (tx != null) { tx.rollback(); } throw new RuntimeException(e.getMessage()); } finally { if (session != null && session.isOpen()) { session.close(); } } } @SuppressWarnings("unchecked") public static ArrayList executeQuery(String hql, String... params) { Session session = openSession(); Transaction tx = null; ArrayList list = null; try { tx = session.beginTransaction(); Query query = session.createQuery(hql); if (params != null && params.length > 0) { for (int i = 0; i < params.length; i++) { query.setParameter(i, params[i]); } } list = (ArrayList) query.list(); tx.commit(); } catch (Exception e) { if (tx != null) tx.rollback(); throw new RuntimeException(e.getMessage()); } finally { if (session != null && session.isOpen()) { session.close(); } } return list; } public static void executeUpdate(String hql, Object... params) { Session session = openSession(); Transaction tx = null; try { tx = session.beginTransaction(); Query query = session.createQuery(hql); if (params != null && params.length > 0) { for (int i = 0; i < params.length; i++) { query.setParameter(i, params[i]); // System.out.println("query influenced: "+params[i]); } } System.out.println("query influenced: " + query.getQueryString()); int n = query.executeUpdate(); System.out.println("query influence: " + n); tx.commit(); } catch (Exception e) { if (tx != null) tx.rollback(); throw new RuntimeException(e.getMessage()); } finally { if (session != null && session.isOpen()) { session.close(); } } } } 这样就成功了; |
|