请问一下。。我用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不能被修改;