在写struts2和hibernate结合应用项目的时候,出现500问题,原因是没有查询成功。
于是用Junit测试了查询,执行@Test时候报错了。错误代码如下:
javax.persistence.PersistenceException: org.hibernate.InstantiationException: No default constructor for entity: : Entity.UserEntity at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:147) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155) at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1419) at org.hibernate.query.internal.AbstractProducedQuery.uniqueResult(AbstractProducedQuery.java:1453) at Entity.UserEntityTest.testHQL(UserEntityTest.java:56) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99) at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81) at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34) at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75) at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45) at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:66) at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35) at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42) at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34) at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52) at org.junit.runner.JUnitCore.run(JUnitCore.java:130) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) Caused by: org.hibernate.InstantiationException: No default constructor for entity: : Entity.UserEntity at org.hibernate.tuple.PojoInstantiator.instantiate(PojoInstantiator.java:85) at org.hibernate.tuple.PojoInstantiator.instantiate(PojoInstantiator.java:105) at org.hibernate.tuple.entity.AbstractEntityTuplizer.instantiate(AbstractEntityTuplizer.java:733) at org.hibernate.persister.entity.AbstractEntityPersister.instantiate(AbstractEntityPersister.java:4740) at org.hibernate.internal.SessionImpl.instantiate(SessionImpl.java:1617) at org.hibernate.internal.SessionImpl.instantiate(SessionImpl.java:1601) at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1658) at org.hibernate.loader.Loader.getRow(Loader.java:1556) at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:740) at org.hibernate.loader.Loader.processResultSet(Loader.java:985) at org.hibernate.loader.Loader.doQuery(Loader.java:943) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:349) at org.hibernate.loader.Loader.doList(Loader.java:2615) at org.hibernate.loader.Loader.doList(Loader.java:2598) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2430) at org.hibernate.loader.Loader.list(Loader.java:2425) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:502) at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:375) at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216) at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1481) at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1441) at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1410) ... 21 more org.hibernate.TransactionException: Transaction was marked for rollback only; cannot commit tarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
...
可以看到这一句:javax.persistence.PersistenceException: org.hibernate.InstantiationException: No default constructor for entity: : Entity.UserEntity
说的是hibernate创建实例化对象出错,在UserEntity这个实体类里面没有默认构造函数:No default constructor。
所以hibernate在创建实体类对象时需要一个默认的无参构造函数,原因如下:
hibernate需要无参构造函数进行反转,因为若要生成类的实例的话,hibernate根本不需要知道这个类中有什么参数属性,用无参的构造函数是最简便的。
如果在实体类中写了带参数的构造函数,就需要手动添加无参构造器。