附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());
能够输出结果,但是改成多的一方就不行了.
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());
能够输出结果,但是改成多的一方就不行了.
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)
既然是一对多关系,怎么知道这个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两次。
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?
另外:List list = session.createQuery("from TAddress").list(); 照样是空指针异常.实在是想不通.还有谢谢你的建议
这里空指针异常,看不明白啊,难道这个hql语句没有找到记录吗。有必要看看这个list集合是不是空的。