Java Hibernate无法加载具有复合id的请求类
我在eclipse插件中使用Hibernate代码生成工具来为应用程序生成pojo类、hbm文件和DAO类。这生成了City.java、Country.java、Countrylanguage.java和CountrylanguageId.java,但只有三个hbm文件City.hbm.xml Country.hbm.xml和Countrylanguage.hbm.xml 我已经通过addClass在配置中添加了java类文件Java Hibernate无法加载具有复合id的请求类,java,eclipse,hibernate,Java,Eclipse,Hibernate,我在eclipse插件中使用Hibernate代码生成工具来为应用程序生成pojo类、hbm文件和DAO类。这生成了City.java、Country.java、Countrylanguage.java和CountrylanguageId.java,但只有三个hbm文件City.hbm.xml Country.hbm.xml和Countrylanguage.hbm.xml 我已经通过addClass在配置中添加了java类文件 protected SessionFactory getSe
protected SessionFactory getSessionFactory() {
Configuration config = new Configuration()
.configure("hibernate.cfg.xml")
.addClass(Country.class)
.addClass(City.class)
.addClass(Countrylanguage.class);
但在尝试使用创建服务注册表时
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(config.getProperties()).build();
它抛出以下错误-
Exception in thread "main" org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.component.PojoComponentTuplizer]
at org.hibernate.tuple.component.ComponentTuplizerFactory.constructTuplizer(ComponentTuplizerFactory.java:107)
at org.hibernate.tuple.component.ComponentTuplizerFactory.constructDefaultTuplizer(ComponentTuplizerFactory.java:128)
at org.hibernate.tuple.component.ComponentMetamodel.<init>(ComponentMetamodel.java:77)
at org.hibernate.tuple.component.ComponentMetamodel.<init>(ComponentMetamodel.java:52)
at org.hibernate.mapping.Component.getType(Component.java:227)
at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:455)
at org.hibernate.mapping.RootClass.validate(RootClass.java:268)
at org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:343)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:461)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708)
at dao.DefaultService.getSessionFactory(DefaultService.java:24)
at dao.DefaultService.<init>(DefaultService.java:14)
at dao.CityService.<init>(CityService.java:21)
at App.main(App.java:6)
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.hibernate.tuple.component.ComponentTuplizerFactory.constructTuplizer(ComponentTuplizerFactory.java:104)
... 13 more
Caused by: org.hibernate.MappingException: component class not found: CountrylanguageId
at org.hibernate.mapping.Component.getComponentClass(Component.java:177)
at org.hibernate.tuple.component.PojoComponentTuplizer.setComponentClass(PojoComponentTuplizer.java:147)
at org.hibernate.tuple.component.AbstractComponentTuplizer.<init>(AbstractComponentTuplizer.java:37)
at org.hibernate.tuple.component.PojoComponentTuplizer.<init>(PojoComponentTuplizer.java:41)
... 18 more
Caused by: org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [CountrylanguageId]
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:133)
at org.hibernate.mapping.Component.getComponentClass(Component.java:174)
... 21 more
Caused by: java.lang.ClassNotFoundException: Could not load requested class : CountrylanguageId
at org.hibernate.boot.registry.classloading.internal.AggregatedClassLoader.findClass(AggregatedClassLoader.java:210)
at java.lang.ClassLoader.loadClass(ClassLoader.java:418)
at java.lang.ClassLoader.loadClass(ClassLoader.java:351)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:130)
... 22 more
线程“main”org.hibernate.HibernateException中的异常:无法实例化默认元组化程序[org.hibernate.tuple.component.pojocomponentuplezer]
位于org.hibernate.tuple.component.ComponentTuplizerFactory.ConstructionTuplizer(ComponentTuplizerFactory.java:107)
位于org.hibernate.tuple.component.ComponentTuplizerFactory.constructDefaultTuplizer(ComponentTuplizerFactory.java:128)
位于org.hibernate.tuple.component.ComponentMetamodel。(ComponentMetamodel.java:77)
位于org.hibernate.tuple.component.ComponentMetamodel。(ComponentMetamodel.java:52)
位于org.hibernate.mapping.Component.getType(Component.java:227)
位于org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:455)
位于org.hibernate.mapping.RootClass.validate(RootClass.java:268)
位于org.hibernate.boot.internal.MetadataImpl.validate(MetadataImpl.java:343)
位于org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:461)
位于org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708)
位于dao.DefaultService.getSessionFactory(DefaultService.java:24)
在dao.DefaultService.(DefaultService.java:14)
在dao.CityService.(CityService.java:21)
位于App.main(App.java:6)
原因:java.lang.reflect.InvocationTargetException
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:423)
位于org.hibernate.tuple.component.ComponentTuplizerFactory.ConstructionTuplizer(ComponentTuplizerFactory.java:104)
... 还有13个
原因:org.hibernate.MappingException:未找到组件类:CountrylanguageId
位于org.hibernate.mapping.Component.getComponentClass(Component.java:177)
位于org.hibernate.tuple.component.pojoComponentUplizer.setComponentClass(pojoComponentUplizer.java:147)
位于org.hibernate.tuple.component.AbstractComponentTuplizer。(AbstractComponentTuplizer.java:37)
位于org.hibernate.tuple.component.PojoComponentTuplizer。(PojoComponentTuplizer.java:41)
... 还有18个
原因:org.hibernate.boot.registry.classloading.spi.ClassLoadingException:无法加载类[CountrylanguageId]
位于org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:133)
位于org.hibernate.mapping.Component.getComponentClass(Component.java:174)
... 还有21个
原因:java.lang.ClassNotFoundException:无法加载请求的类:CountrylanguageId
位于org.hibernate.boot.registry.classloading.internal.AggregatedClassLoader.findClass(AggregatedClassLoader.java:210)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:418)
位于java.lang.ClassLoader.loadClass(ClassLoader.java:351)
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(Class.java:348)
位于org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:130)
... 还有22个
我试着加上
.addClass(CountrylanguageId.class)
但这引发了另一个错误,即相应的hbm文件Countrylanguage.hbm.xml丢失
基于复合id关系生成的类是否需要hbm文件?为什么即使在hibernate配置实例中指定了类,也会出现此错误?解决了这个问题。
在生成pojo类时使用hibernate工具,我将其指定为默认包,但在子文件夹src/main/java/entity下生成它们
hbm文件已更新为将class=“…”引用和name=“…”引用设置为entity.Countrylanguage,之后就可以正常工作了
还验证了使用hibernate生成工具,将包配置为实体,将文件夹配置为默认src/main/java,可以按照预期正确输出hbm文件
将此问题标记为已回答并关闭它