1

セッションファクトリとコンフィグレーションを別のプロジェクトから継承するときに問題が発生します。 私は2つの別々のプロジェクト(コアプロジェクト、プロジェクトはコアをライブラリとして使用します) 私のコアプロジェクトのコンフィグレーションは次のコード:セッションファクトリが注釈付きエンティティを認識しない

package ir.badnava.pressmining.core.config; 

import java.util.Properties; 

import javax.sql.DataSource; 

import org.hibernate.SessionFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.PropertySource; 
import org.springframework.core.env.Environment; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.orm.hibernate5.HibernateTransactionManager; 
import org.springframework.orm.hibernate5.LocalSessionFactoryBean; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 

import ir.badnava.pressmining.core.models.raw.base.BaseRawEntity; 
import ir.badnava.pressmining.core.models.raw.page.RawPageEntity; 

@Configuration 
@ComponentScan(basePackages = { "ir.badnava.pressmining" }) 
@EnableTransactionManagement 
@PropertySource(value = { "classpath:database.properties" }) 
public class AppConfig { 

    @Autowired 
    private Environment environment; 

    @Bean(name = "sessionFactory") 
    public LocalSessionFactoryBean getSessionFactory() { 
     LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); 
     sessionFactory.setDataSource(getDataSource()); 
     setAnotatedClasses(sessionFactory); 
     sessionFactory.setHibernateProperties(getHibernateProperties()); 
     return sessionFactory; 
    } 

    protected void setAnotatedClasses(LocalSessionFactoryBean sessionFactory) { 
     sessionFactory.setAnnotatedClasses(new Class<?>[]{BaseRawEntity.class, RawPageEntity.class}); 
    } 

    @Bean(name = "dataSource") 
    public DataSource getDataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName")); 
     dataSource.setUrl(environment.getRequiredProperty("jdbc.url")); 
     dataSource.setUsername(environment.getRequiredProperty("jdbc.username")); 
     dataSource.setPassword(environment.getRequiredProperty("jdbc.password")); 
     return dataSource; 
    } 

    private Properties getHibernateProperties() { 
     Properties properties = new Properties(); 
     properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect")); 
     properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql")); 
     properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql")); 
     properties.put("hibernate.hbm2ddl.auto", environment.getRequiredProperty("hibernate.hbm2ddl.auto")); 
     return properties; 
    } 

    @Autowired 
    @Bean(name = "transactionManager") 
    public HibernateTransactionManager getTransactionManager(SessionFactory s) { 
     HibernateTransactionManager txManager = new HibernateTransactionManager(s); 
     return txManager; 
    } 

} 

と子プロジェクトの構成は、次のコードです:

package com.badnava.pressmining.web.crawler.config; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.orm.hibernate5.LocalSessionFactoryBean; 

import com.badnava.pressmining.web.crawler.crawler.WebCrawler; 
import com.badnava.pressmining.web.crawler.models.speciallist.RepositoryList; 
import com.badnava.pressmining.web.crawler.models.speciallist.RepositoryListManager; 
import com.badnava.pressmining.web.crawler.models.urlrepo.UrlRepository; 
import com.badnava.pressmining.web.crawler.models.urlrepo.UrlRepositoryManager; 

@Configuration 
public class AppConfig extends ir.badnava.pressmining.core.config.AppConfig{ 

    @Bean 
    public RepositoryListManager getRepositoryListManager() { 
     return new RepositoryListManager(); 
    } 

    @Bean 
    public UrlRepositoryManager getUrlRepositoryManager() { 
     return new UrlRepositoryManager(); 
    } 

    @Bean 
    public WebCrawler getWebCrawler(){ 
     return new WebCrawler(); 
    } 

    @Override 
    protected void setAnotatedClasses(LocalSessionFactoryBean sessionFactory) { 
     super.setAnotatedClasses(sessionFactory); 
     sessionFactory.setAnnotatedClasses(new Class<?>[]{RepositoryList.class, UrlRepository.class}); 
    } 

} 

と私の問題は、子プロジェクトで、私はsetAnnotatedClassメソッドをオーバーロードということですし、セッションファクトリに自分のエンティティクラスを与えますが、セッションファクトリには未知のマッピングエンティティがあります。

XMLファイルでこれまで何をしていたのか分かりません設定

更新: ログ: 問題はsetAnnotatedClasses方法は、setterメソッドであるということであったと私は、コードを怒鳴るために自分のコードを変更し、それはです:

Exception in thread "Thread-3" org.hibernate.MappingException: Unknown entity: ir.badnava.pressmining.core.models.raw.page.RawPageEntity 
    at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:776) 
    at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1533) 
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:104) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) 
    at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) 
    at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32) 
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) 
    at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:682) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:674) 
    at org.hibernate.internal.SessionImpl.save(SessionImpl.java:669) 
    at ir.badnava.pressmining.core.models.raw.base.BaseDao.save(BaseDao.java:16) 
    at ir.badnava.pressmining.core.models.raw.base.BaseDao$$FastClassBySpringCGLIB$$d95ff2ca.invoke(<generated>) 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:720) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:280) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) 
    at ir.badnava.pressmining.core.models.raw.base.BaseDao$$EnhancerBySpringCGLIB$$95dae3fd.save(<generated>) 
    at ir.badnava.pressmining.core.models.raw.base.BaseManager.save(BaseManager.java:23) 
    at com.badnava.pressmining.web.crawler.crawler.WebCrawler$3.run(WebCrawler.java:142) 
    at java.lang.Thread.run(Thread.java:745) 
+0

それはセッターメソッドですsura2k @へ

@Override protected Class<?>[] setAnotatedClasses() { Class<?>[] superClasses = super.setAnotatedClasses(sessionFactory); Class<?>[] childClasses = new Class<?>[]{RepositoryList.class, UrlRepository.class}; Class<?>[] allClasses = new Class<?>[childClasses.length + superClasses.length]; for (int i = 0; i < allClasses.length; i++) { if (i < superClasses.length) allClasses[i] = superClasses[i]; else allClasses[i] = childClasses[i-childClasses.length]; } return allClasses; } 

おかげで動作する(べきである)と、もしそうなら、あなたは2回目でそれを呼び出すと、その値に置き換えられます。 – sura2k

+0

私はスーパーからクラスリストを取得して子クラスに設定してもそれをテストしますが、何も変更されていません –

+0

私もそれをデバッグし、setAnnotatedClasses()を呼び出すと、sessionfactoryは4クラスを持ちますが、コアプロジェクト私は例外 –

答えて

1

問題が解決

+0

khafanに、khubに:D –

関連する問題