Java Hibernate无法加载具有复合id的请求类

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

我在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 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文件

将此问题标记为已回答并关闭它