2 qq 24219459 qq_24219459 于 2016.04.30 20:31 提问

Hibernate中的session的save方法。

我正在学习hibernate框架,然后在做一个插入的时候遇到了一个问题。通过跟踪我发现在执行session.save(obj);方法时,程序就不动了。并且在获取session时还打印出下面红色的信息。
请问一个是什么原因以及怎么解决呢?
图片说明

 public int insertClient(Client client) {
        // TODO Auto-generated method stub
        //HibernateUtil.closeSession();
        System.out.println("client insert1 :");
        Session session = HibernateUtil.currentSession();
        //System.out.println(session);
        System.out.println("client insert2 :");
        Transaction transaction = session.beginTransaction();
        System.out.println("client insert3 :");
        System.out.println(client);
        Integer s= (Integer) session.save(client);
        System.out.println("client insert4 :"+s);
        try {
            transaction.commit();
        } catch (Exception e) {
            transaction.rollback();
        } finally {
            HibernateUtil.closeSession();
        }
        System.out.println("row :"+s);
        return s;
    }
 public class HibernateUtil
{
    public static final SessionFactory sessionFactory;

    static
    {
        try
        {
            // 使用默认的hibernate.cfg.xml配置文件创建Configuration实例
            Configuration cfg = new Configuration()
                .configure();
            // 以Configuration实例来创建SessionFactory实例
            ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
                .applySettings(cfg.getProperties()).build();
            sessionFactory = cfg.buildSessionFactory(serviceRegistry);
        }
        catch (Throwable ex)
        {
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    // ThreadLocal可以隔离多个线程的数据共享,因此不再需要对线程同步
    public static final ThreadLocal<Session> session
        = new ThreadLocal<Session>();

    public static Session currentSession()
        throws HibernateException
    {
        Session s = session.get();
        System.out.println("session get:");
        // 如果该线程还没有Session,则创建一个新的Session
        if (s == null)
        {
            s = sessionFactory.openSession();
            // 将获得的Session变量存储在ThreadLocal变量session里
            session.set(s);
        }
        return s;
    }

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

5个回答

CSDNXIAOS
CSDNXIAOS   2016.04.30 20:42

Session的save()方法使一个临时对象转变为持久化对象。例如以下代码保存一个Customer对象:
       Customer customer = new Customer();
       customer.setId(new Long(9)); // 为Customer临时对象设置OID是无效的
       customer.setName("Tom");......
答案就在这里:Hibernate Session的save()方法
----------------------Hi,地球人,我是问答机器人小S,上面的内容就是我狂拽酷炫叼炸天的答案,除了赞同,你还有别的选择吗?

devmiao
devmiao   Ds   Rxr 2016.04.30 23:01
u014427391
u014427391   2016.05.01 00:31
captainzgm
captainzgm   2016.05.01 00:49

client1已经打印,然后就不动了,是不是数据库断开了

qq_24219459
qq_24219459 不是,是因为数据库表里有两个只差一个字母的列,导致pojo与表对应不上,所以才会那样。但是为什么是在那一步停止而不是说我映射失败,这个我还没弄清楚
一年多之前 回复
whoSaidNo
whoSaidNo   2016.05.01 11:13

session.get ( )方法是什么,你自己定义的吗,我知道有个Session.get(Integer id )静态方法需要传入对象的id

qq_24219459
qq_24219459 ThreadLocal<Session> session;这里产生的session.是从线程池里拿一个session。
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!