日期:2014-05-19  浏览次数:20813 次

请问一下。。我用hibernate做查找时候 出现空指向?
Java code

public void create() {
        Configuration cfg = new Configuration();
        cfg.configure();
        SessionFactory sf = cfg.buildSessionFactory();
        Session s = sf.openSession();

        System.out.println("增加");
        s = sf.openSession();
        Transaction tx = s.beginTransaction();// 开启事务
        User user = new User();
        user.setName("张三");
        user.setPassword("1234");
        s.save(user);
        tx.commit();
        s.close();
    }
//这是添加的代码


Java code

public void selectId() {
        Configuration cfg = new Configuration();
        cfg.configure();
        SessionFactory sf = cfg.buildSessionFactory();

        User user = new User();

        user.setName("张三");
        user.setPassword("1234");
    
        System.out.println("查找");
        Session s = sf.openSession();
        System.out.println("打印一下user.getID():"+user.getId());
        User use1 = (User) s.get(User.class, user.getId());// 调用get方法

        if (use1 == null) {
            System.out.println("三蛋你妹啊,这怎么还是空的啊");
        } else {
            System.out.println("ID:" + use1.getId());// 获取其中的属性
            System.out.println("NAME:" + use1.getName());
            System.out.println("AGE:" + use1.getPassword());
        }
        s.close();
    }
//这是查找的代码



现在的问题是。如果这两个分开写 就会出现空指向异常 
但是如果 写在一个方法里
也就是这样 
Java code

public void selectId() {
        Configuration cfg = new Configuration();
        cfg.configure();
        SessionFactory sf = cfg.buildSessionFactory();
        Session s = sf.openSession();

        System.out.println("增加");
        s = sf.openSession();
        Transaction tx = s.beginTransaction();// 开启事务
        User user = new User();
        user.setName("张三");
        user.setPassword("1234");
        s.save(user);
        tx.commit();
        s.close();
        System.out.println("查找");
        s = sf.openSession();
        System.out.println("打印一下user.getID():" + user.getId());
        User use1 = (User) s.get(User.class, user.getId());// 调用get方法

        if (use1 == null) {
            System.out.println("三蛋你妹啊,这怎么还是空的啊");
        } else {
            System.out.println("ID:" + use1.getId());// 获取其中的属性
            System.out.println("NAME:" + use1.getName());
            System.out.println("AGE:" + use1.getPassword());
        }
        s.close();
    }
//这样的话 增加 和查看在一起 了 就没有空异常了
这是为什么呢 我想了2天没想明白。。=


求各位大神帮忙啊

------解决方案--------------------
请问楼主,你分开写的时候System.out.println("打印一下user.getID():" + user.getId());
能得到id的值吗?

------解决方案--------------------
看来你对对象还不够理解。。。我讲述给你听吧!首先你这个出现问题的原因是。。。你查找的对象里面不存在这个id,那当然取出来是空的对吧,System.out.println("打印一下user.getID():" + user.getId());,而你和在一起写为什么能够取到值呢?是因为你查询返回的对象存在这个id所以就没有报空指针了!对于你这个解决方案有你的查询不要根据id来查你可以选择名字或者密码!这样的话就不会报空指针了User use1 = (User) s.get(User.class, user.getId());// 调用get方法

------解决方案--------------------
就一句话:楼主不清楚hibernte的几种状态(瞬时对象,持久对象,脱管对象),学了就知道为啥了
------解决方案--------------------
应为你的Configuration new了2个不是一个东西,你把上一个方法的Configuration 传到下一个方法里直接用就不会空了
------解决方案--------------------