写一段测试的代码,使用Hibernate读取一行数据时,报错Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister。
网上查了一下,有几种情况:
- JAR未引入
- 实体类中缺少无参构造函数
- 其他原因
当时只顾着查这个报错信息,排除了这些情况,发现还是没有好转。后来发现是bean类和自动生成的hbm.xml里的属性映射不对,修改后就可以正常运行了。
坑点有二:
- 之前老项目的开发人员不太注重规范,bean类里type属性映射到数据表里的date字段之类的问题时有出现(对,他们date也是用varchar来存),这个项目延用了之前的bean类,不留神就中枪(论开发规范的重要性)
- 报错信息要看完,要找到报错信息里关键的部分
这里重现一下当时的错误,不完全一致,仅供记录和参考。
org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
at org.hibernate.persister.internal.PersisterFactoryImpl.create(PersisterFactoryImpl.java:185)
at org.hibernate.persister.internal.PersisterFactoryImpl.createEntityPersister(PersisterFactoryImpl.java:135)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:386)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1744)
at util.HibernateSessionFactory.<clinit>(HibernateSessionFactory.java:34)
at dao.impl.BaseDaoImpl.<init>(BaseDaoImpl.java:15)
at dao.impl.ProcessInfoDaoImpl.<init>(ProcessInfoDaoImpl.java:6)
at test.ProcessInfoDBTest.main(ProcessInfoDBTest.java:15)
Caused by: org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:138)
at org.hibernate.tuple.entity.EntityTuplizerFactory.constructDefaultTuplizer(EntityTuplizerFactory.java:188)
at org.hibernate.tuple.entity.EntityMetamodel.<init>(EntityMetamodel.java:341)
at org.hibernate.persister.entity.AbstractEntityPersister.<init>(AbstractEntityPersister.java:505)
at org.hibernate.persister.entity.SingleTableEntityPersister.<init>(SingleTableEntityPersister.java:144)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.hibernate.persister.internal.PersisterFactoryImpl.create(PersisterFactoryImpl.java:163)
... 7 more
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.hibernate.tuple.entity.EntityTuplizerFactory.constructTuplizer(EntityTuplizerFactory.java:135)
... 16 more
Caused by: org.hibernate.PropertyNotFoundException: Could not find a getter for inceptType in class bean.ProcessInfo
at org.hibernate.property.BasicPropertyAccessor.createGetter(BasicPropertyAccessor.java:316)
at org.hibernate.property.BasicPropertyAccessor.getGetter(BasicPropertyAccessor.java:310)
at org.hibernate.mapping.Property.getGetter(Property.java:320)
at org.hibernate.tuple.entity.PojoEntityTuplizer.buildPropertyGetter(PojoEntityTuplizer.java:436)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.<init>(AbstractEntityTuplizer.java:200)
at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:82)
... 21 more
Exception in thread "main" java.lang.NullPointerException
at dao.impl.BaseDaoImpl.getSession(BaseDaoImpl.java:24)
at dao.impl.BaseDaoImpl.findById(BaseDaoImpl.java:38)
at service.impl.BaseServiceImpl.findById(BaseServiceImpl.java:24)
at test.ProcessInfoDBTest.main(ProcessInfoDBTest.java:16)