【发布时间】:2020-05-11 11:36:33
【问题描述】:
我在 Eclipse 插件中使用 Hibernate 代码生成工具为world database 生成 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
我尝试添加
.addClass(CountrylanguageId.class)
但这会引发另一个错误,即缺少相应的 hbm 文件 Countrylanguage.hbm.xml。
基于复合ID关系生成的类是否需要hbm文件?即使在休眠配置实例中指定了类,为什么还会出现此错误?
【问题讨论】: