附t_user表中的内容:
mysql> select * from t_user;
+----+------+--------------+
| id | age  | name         |
+----+------+--------------+
|  9 | NULL | hu           |
| 11 | NULL | NULL         |
| 12 | NULL | NULL         |
| 13 | NULL | NULL         |
+----+------+--------------+
在testGetById()方法中:
TUser user  = (TUser)session.get(TUser.class, new Integer(9));
System.out.println(user.getAge());
能够输出结果,但是改成多的一方就不行了.

解决方案 »

  1.   

    trace内容:java.lang.NullPointerException
    at org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)
    at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121)
    at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232)
    at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173)
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)
    at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:830)
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:266)
    at org.hibernate.type.EntityType.resolve(EntityType.java:303)
    at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:116)
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)
    at org.hibernate.loader.Loader.doQuery(Loader.java:717)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
    at org.hibernate.loader.Loader.doList(Loader.java:2145)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
    at org.hibernate.loader.Loader.list(Loader.java:2024)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
    at org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:749)
    at com.puma.test.One2ManyTest.testGetById(One2ManyTest.java:158)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at junit.framework.TestCase.runTest(TestCase.java:154)
    at junit.framework.TestCase.runBare(TestCase.java:127)
    at junit.framework.TestResult$1.protect(TestResult.java:106)
    at junit.framework.TestResult.runProtected(TestResult.java:124)
    at junit.framework.TestResult.run(TestResult.java:109)
    at junit.framework.TestCase.run(TestCase.java:118)
    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
      

  2.   

    t_address 中 ID为9的记录存在么?
      

  3.   

    TAddress address = (TAddress)session.createQuery(hql).setParameter(0, new Integer(9)).uniqueResult();
    既然是一对多关系,怎么知道这个hql语句是唯一集咧,难道这个参数不是userid?而是t_address的id。
    再者,既然是级联的,在这段代码里面
    public void testInsertUser()
    {
    Transaction trs = session.beginTransaction();
    // 创建一个用户
    TUser user = new TUser();
    user.setName("huangyipingq");//创建一个地址
    TAddress addr = new TAddress();
    addr.setAddress("hubei_jianshi");
    addr.setZipcode("445300");addr.setUser(user);session.save(user);
    session.save(addr);
    trs.commit();
    }
    没有必要同时session.save(user)后,还要session.save(addr);
    其实,在只要session.save(user)即可,前提是你要在之前调用user.setAddresses(new HashSet().add(addr)),这样没有必要save两次。
      

  4.   

    楼上正解,还有.你的查讯可以用联合查讯来做.刚开始会INSERT和简单的查讯就可以.夏昕的书里后面有一个专门介绍查讯的章节.
      

  5.   

    楼上两位确实说的正确:
    public void testInsertUser()
    {
    Transaction trs = session.beginTransaction();
    // 创建一个用户
    TUser user = new TUser();
    user.setName("xxxxxxxxxxxxxxx");

    //创建一个地址
    TAddress addr = new TAddress();
    addr.setAddress("hubei_jianshi");
    addr.setZipcode("445300");

                    user.getAddresses().add(addr);
    addr.setUser(user);

    session.save(user);
    trs.commit();
    }
    经过一次save即可完成.但这个问题不是关键,
    如果把testGetById()方法换成:
    public void testGetById()
    {
    TAddress address = (TAddress)session.get(TAddress.class, new Integer(13));

    System.out.println(address.getZipcode());

    }
    并且数据库中确实存在ID为13的t_address记录.错误仍然为空指针异常.错误堆栈一样.WHY?
      

  6.   

    你可以先查出USER类的一个对像.然后GET到他的地址.再ITERATOR.
      

  7.   

    实现倒是可以的.如果我要得出所有address记录,那要先查询所有的user,然后一个一个iterator.
    另外:List list = session.createQuery("from TAddress").list(); 照样是空指针异常.实在是想不通.还有谢谢你的建议
      

  8.   

    List list = session.createQuery("from TAddress").list(); 
    这里空指针异常,看不明白啊,难道这个hql语句没有找到记录吗。有必要看看这个list集合是不是空的。