1

다른 프로젝트에서 세션 팩토리 및 구성을 상속 할 때 몇 가지 문제점이 있습니다. 두 개의 개별 프로젝트 (코어 프로젝트, 프로젝트는 코어를 라이브러리로 사용합니다) 내 핵심 프로젝트의 구성은 다음과 같습니다. 다음 코드를세션 팩토리가 주석 처리 된 엔티티를 알지 못함

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 방법은 세터 방법이었다 내가 코드를 울부 짖는 소리 내 코드를 변경하고 그건 :

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

khuban하려면, khub : D 조 –