读书人

请教一上。小弟我用hibernate做查找时

发布时间: 2012-09-10 11:02:33 作者: rapoo

请问一下。。我用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 传到下一个方法里直接用就不会空了
------解决方案--------------------


我觉得是你Configuration new的问题 hibernate的东西不应该自己new 很久没用hibernate了
[解决办法]
Session.save(user)运行机理。
1,把User对象加入缓存中,使它变成持久化对象;
2,选用映射文件指定的标识生成ID;
3,在Session清理缓存时候执行:在底层生成一个insert sql语句,把对象存入数据库;

注意:在你执行Session.save(user)后,在Session清理缓存前,如果你修改user对象属性值,那么最终存入数据库的值将是最后修改的值;此过程中ID不能被修改;

读书人网 >J2EE开发

热点推荐