Java Hibernate Spring AnnotationException не отображенный класс - PullRequest
1 голос
/ 02 марта 2012

mvn clean install работает без ошибок, но когда я запускаю tomcat6, я получаю следующую ошибку: Причина:

org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.xxx.server.entity.app.App.distributions[com.xxx.server.entity.distribution.Distribution]

Все дерево в конце.

Я искал целый день здесь и в Интернете, но не нашел для меня работающего решения.

Настройка: Я хочу установить связь между многими и многими пользователями Hibernate между двумя классами: App и Distribution:

Distribution.java:

@Entity
@Table(name = "DISTRIBUTION")
public class Distribution extends xxxEntity {

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "APP_DISTRIBUTION", joinColumns = { @JoinColumn(name = "distribution_id") }, inverseJoinColumns = { @JoinColumn(name = "app_id") })
    private Set<App> apps;

    }

App.java:

@Entity
@Table(name="APP")
public class App extends xxxEntity {

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "APP_DISTRIBUTION", joinColumns = { @JoinColumn(name = "app_id") }, inverseJoinColumns = { @JoinColumn(name = "distribution_id") })
    private Set<Distribution> distributions;

Я тоже пробовал это с targetEntity.

сопоставление находится в файле server-persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">

<context:annotation-config />


<bean id="serverPropertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location">
        <value>file:${xxx_server_config_location}/xxx-server.properties
        </value>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>

<!-- Definition of the data source -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="${dataSource.driverClass}" />
    <property name="url" value="${dataSource.url}" />
    <property name="username" value="${dataSource.username}" />
    <property name="password" value="${dataSource.password}" />
    <property name="initialSize" value="${dataSource.initialSize}" />
    <property name="maxActive" value="${dataSource.maxActive}" />
    <property name="maxIdle" value="${dataSource.maxIdle}" />
    <property name="minIdle" value="${dataSource.minIdle}" />
    <property name="validationQuery" value="select 1" />
    <property name="testOnBorrow" value="true" />
    <property name="testOnReturn" value="false" />
    <property name="testWhileIdle" value="false" />
</bean>

<!-- Starts up Hibernate -->
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
    <property name="dataSource" ref="dataSource" />
    <property name="entityInterceptor">
        <bean class="com.xxx.server.util.hibernate.AuditInterceptor" />
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>

            <prop key="hibernate.jdbc.batch_size">${hibernate.batchSize}</prop>
            <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop>
            <prop key="hibernate.cache.use_query_cache">false</prop>
            <!--
                use log4j.logger.org.hibernate.SQL=debug in log4j config to show
                SQL
            -->
            <prop key="hibernate.show_sql">false</prop>

            <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
            <prop key="hiberhibernate.hbm2ddl.export">${hibernate.hbm2ddl.export}</prop>
            <prop key="hibernate.hbm2ddl.outputfilename">${hibernate.hbm2ddl.outputfilename}</prop>


        </props>
    </property>
    <property name="annotatedClasses">
        <list>
            <value>com.xxx.server.entity.user.AdminUser</value>
            <value>com.xxx.server.entity.app.App</value>
            <value>com.xxx.server.entity.app.AppCategory</value>    
            <value>com.xxx.server.entity.app.AppLanguageSpecific</value>    
            <value>com.xxx.server.entity.device.Device</value>  
            <value>com.xxx.server.entity.device.Vendor</value>
            <value>com.xxx.server.entity.distribution.Distribution</value>
            <value>com.xxx.server.entity.feedback.UserFeedback</value>
            <value>com.xxx.server.entity.info.Info</value>
            <value>com.xxx.server.entity.info.InfoParam</value>
            <value>com.xxx.server.entity.infotype.InfoType</value>
            <value>com.xxx.server.entity.infotype.InfoTypeParam</value>
            <value>com.xxx.server.entity.logging.LoggingEvent</value>
            <value>com.xxx.server.entity.user.User</value>

        </list>
    </property>
</bean>

<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory">
        <ref bean="sessionFactory" />
    </property>
</bean>
</beans>

Вывод на консоль:

SCHWERWIEGEND: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appUploadService': Autowiring of fields failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.xxx.server.dao.AppDao com.xxx.backend.admin.service.impl.AppUploadServiceImpl.appDao; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appDao' defined in class path resource [applicationContext-server-persistence.xml]: Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext-server-persistence.xml]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.xxx.server.entity.app.App.distributions[com.xxx.server.entity.distribution.Distribution]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:243)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:959)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:728)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:380)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4135)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4630)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:445)
    at org.apache.catalina.core.StandardService.start(StandardService.java:519)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.xxx.server.dao.AppDao com.xxx.backend.admin.service.impl.AppUploadServiceImpl.appDao; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appDao' defined in class path resource [applicationContext-server-persistence.xml]: Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext-server-persistence.xml]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.xxx.server.entity.app.App.distributions[com.xxx.server.entity.distribution.Distribution]
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:435)
    at org.springframework.beans.factory.annotation.InjectionMetadata.injectFields(InjectionMetadata.java:105)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessAfterInstantiation(AutowiredAnnotationBeanPostProcessor.java:240)
    ... 31 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'appDao' defined in class path resource [applicationContext-server-persistence.xml]: Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext-server-persistence.xml]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.xxx.server.entity.app.App.distributions[com.xxx.server.entity.distribution.Distribution]
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:275)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:104)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1245)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1010)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:671)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:610)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:412)
    ... 33 more
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in class path resource [applicationContext-server-persistence.xml]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.xxx.server.entity.app.App.distributions[com.xxx.server.entity.distribution.Distribution]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1338)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:269)
    ... 48 more
Caused by: org.hibernate.AnnotationException: Use of @OneToMany or @ManyToMany targeting an unmapped class: com.xxx.server.entity.app.App.distributions[com.xxx.server.entity.distribution.Distribution]
    at org.hibernate.cfg.annotations.CollectionBinder.bindManyToManySecondPass(CollectionBinder.java:1071)
    at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:602)
    at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:543)
    at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:66)
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1163)
    at org.hibernate.cfg.AnnotationConfiguration.secondPassCompile(AnnotationConfiguration.java:329)
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1148)
    at org.springframework.orm.hibernate3.LocalSessionFactoryBean.buildSessionFactory(LocalSessionFactoryBean.java:673)
    at org.springframework.orm.hibernate3.AbstractSessionFactoryBean.afterPropertiesSet(AbstractSessionFactoryBean.java:211)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1369)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1335)
    ... 58 more
02.03.2012 15:47:59 org.apache.catalina.core.StandardContext start
SCHWERWIEGEND: Error listenerStart
02.03.2012 15:47:59 org.apache.catalina.core.StandardContext start
SCHWERWIEGEND: Context [/xxx-appstore-admin] startup failed due to previous errors
02.03.2012 15:47:59 org.apache.catalina.core.ApplicationContext log
INFO: Closing Spring root WebApplicationContext
log4j:ERROR LogMananger.repositorySelector was null likely due to error in class reloading, using NOPLoggerRepository.

Еще одна странная вещь: в проекте уже работает реализация ManyToMany, которая прекрасно работает:

public class Info extends xxxEntity {
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "USER_INFO", joinColumns = { @JoinColumn(name = "info_id") }, inverseJoinColumns = { @JoinColumn(name = "user_id") })
    private Set<User> users;

public class User extends xxxEntity {
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(name = "USER_INFO", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "info_id") })
    private Set<Info> infos;

Я написал два теста, и они прошли через !!!

public class DistributionTest extends BaseDaoTest {
    @Test
    @Transactional
    @Rollback(true)
    public void testDistribution() {
        // Test saving and loading Distribution
        Distribution distribution = DomainCreator.createDistribution("Fedora", "16.01");
        this.distributionDao.save(distribution); 
        assertEquals(distribution, this.distributionDao.findByName("Fedora"));

        // test loading set of distributions
        App app = appDao.findById("a1");
        Set<Distribution> distros = app.getDistributions();
        assertEquals(3, distros.size());
   }
}

public class AppDaoTest extends BaseDaoTest   {
@Test
@Transactional
@Rollback(true)
public void getAppsByDistribution() {
    Distribution distribution = distributionDao.findById("d1");
    Set<App> apps = distribution.getApps();
    assertEquals(4, apps.size());
}
}

Итак, я полагаю, что это проблема с Tomcat6?

То, что я также сделал: удаление всего в каталоге развертывания Tomcat при публикации, но все та же ошибка.

У кого-нибудь есть идея?

Ответы [ 2 ]

0 голосов
/ 06 марта 2012

После того, как я написал тесты, которые прошли. У меня была идея, что мой местный tomcat6 делает что-то не так. Поэтому я развернул свои изменения на другом сервере, и там это сработало! Извините, что беспокою вас неправильным вопросом.

Большое спасибо всем за помощь.

Приветствия

Flo

0 голосов
/ 02 марта 2012

Проверьте пример 3 на http://docs.oracle.com/javaee/5/api/javax/persistence/ManyToMany.html. Таким образом, отображение приложения должно быть таким,

@Entity
@Table(name="APP")
public class App extends xxxEntity {

    @ManyToMany(mappedBy="apps")
    private Set<Distribution> distributions;

Также проверьте, настроены ли joinColumns и inverseJoinColumns в соответствии с примером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...