2016-04-12 11 views
1

私は、hibernate spring integrationを持つJava Webサービスを持っています。私のプロジェクトでは、同じデータベースを2つ接続する必要がありますが、別の場所に接続する必要があります。私はこれらのデータベースでHibernateセッションを設定するために各プロジェクトの内容を更新する必要がありますが、2つのデータベースにコンテンツを挿入しようとすると、1つのdb接続に対して作成されたセッションが別の1つの戻り値 "org.hibernate.HibernateException: "私のコードに必要な変更はありますか?前もって感謝します。複数のデータベース接続でHibernateセッションを作成するJava Webサービスで

applicationContext.xmlを

<context:component-scan base-package="com.sas.sakthi.rest" /> 

<!-- <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basename" value="classpath:messages" /> <property name="defaultEncoding" 
    value="UTF-8" /> </bean> --> 
<bean id="propertyConfigurer" 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" 
    p:location="/WEB-INF/jdbc.properties" /> 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close" p:driverClassName="${jdbc.driverClassName}" 
    p:url="${jdbc.databaseurl}" p:username="${jdbc.username}" p:password="${jdbc.password}" /> 

<bean id="dataSourceTwo" class="org.apache.commons.dbcp.BasicDataSource" 
    destroy-method="close" p:driverClassName="${jdbc.driverClassName}" 
    p:url="${jdbc.databaseurltwo}" p:username="${jdbc.usernametwo}" 
    p:password="${jdbc.passwordtwo}" /> 

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="annotatedClasses"> 
     <list> 
      <value>com.sas.sakthi.rest.model.CategoryDO</value> 
      <value>com.sas.sakthi.rest.model.ProductDO</value> 
      <value>com.sas.sakthi.rest.model.CustomerDO</value>    
      <value>com.sas.sakthi.rest.model.SubCategoryDO</value> 
      <value>com.sas.sakthi.rest.model.SmsLogDO</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${jdbc.dialect}</prop> 
      <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 
</bean> 
<bean id="sessionFactoryTwo" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSourceTwo" /> 
    <property name="annotatedClasses"> 
     <list> 
      <value>com.sas.sakthi.rest.model.CategoryDO</value> 
      <value>com.sas.sakthi.rest.model.ProductDO</value> 
      <value>com.sas.sakthi.rest.model.CustomerDO</value>   
      <value>com.sas.sakthi.rest.model.SubCategoryDO</value> 
      <value>com.sas.sakthi.rest.model.SmsLogDO</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${jdbc.dialect}</prop> 
      <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 
</bean> 

<!-- <bean id="AbstractHibernateDAO" class="com.stnage.service.rest.dao.AbstractHibernateDAOImpl"></bean> 
    <bean id="BatchMessageManagerDAO" class="com.stnage.service.rest.dao.BatchMessageManagerDAOImpl"></bean> 
    <bean id="BatchMessageManagerService" class="com.stnage.service.rest.service.BatchMessageManagerServiceImpl"></bean> --> 
<tx:annotation-driven transaction-manager="transactionManager" /> 
<tx:annotation-driven transaction-manager="transactionManagerTwo" /> 

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 
<bean id="transactionManagerTwo" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactoryTwo" /> 
</bean> 

jdbc.properties

jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.dialect=org.hibernate.dialect.MySQLDialect 
jdbc.databaseurl=jdbc:mysql://localhost:3306/sakthi 
jdbc.username=root 
jdbc.password=XXXXXX 
jdbc.databaseurltwo=jdbc:mysql://192.168.2.15:3306/sakthi 
jdbc.usernametwo=YYYY 
jdbc.passwordtwo=XXXXXX 

HibernateDAO.java

@Autowired 
@Qualifier("sessionFactory") 
SessionFactory sessionFactory; 

@Autowired 
@Qualifier("sessionFactoryTwo") 
SessionFactory sessionFactoryTwo; 

@Override 
public void create(BaseModel entity) { 
    getCurrentSession().persist(entity); 
} 

@Override 
public void update(BaseModel entity) { 
    getCurrentSession().merge(entity); 
} 

@Override 
public void save(BaseModel entity) { 
    getCurrentSession().saveOrUpdate(entity); 
} 

@Override 
public void delete(BaseModel entity) { 
    getCurrentSession().delete(entity); 
} 

@Override 
public Session getCurrentSession() { 
    return sessionFactory.getCurrentSession(); 
} 

@Override 
public void refresh(BaseModel entity) { 
    getCurrentSession().refresh(entity); 
} 

@Override 
public <T> BaseModel findById(Class<T> entityClass, int entityId) { 
    return (BaseModel) getCurrentSession().get(entityClass, entityId); 
} 

@Override 
public void createTwo(BaseModel entity) { 
    getCurrentSessionTwo().persist(entity); 
} 

@Override 
public void updateTwo(BaseModel entity) { 
    getCurrentSessionTwo().merge(entity); 
} 

@Override 
public void saveTwo(BaseModel entity) { 
    getCurrentSessionTwo().saveOrUpdate(entity); 
} 

@Override 
public void deleteTwo(BaseModel entity) { 
    getCurrentSessionTwo().delete(entity); 
} 

@Override 
public Session getCurrentSessionTwo() { 
    return sessionFactoryTwo.getCurrentSession(); 
} 

@Override 
public void refreshTwo(BaseModel entity) { 
    getCurrentSessionTwo().refresh(entity); 
} 

@Override 
public <T> BaseModel findByIdTwo(Class<T> entityClass, int entityId) { 
    return (BaseModel) getCurrentSessionTwo().get(entityClass, entityId); 
} 

SmsLogDataFetchServiceImpl.java

@Service 
public class SmsLogDataFetchServiceImpl implements 
SmsLogDataFetchService { 

@Autowired 
ProductDataFetchDAO proFetchDAO;//extends HibernateDAO.java 

@Override 
public int savenewentry(String msg, String phoneNo, String receivedOn) { 
    try { 
     if (msg != null || phoneNo != null || receivedOn != null) { 
      SmsLogDO smsDO = new SmsLogDO(); 
      smsDO.setCustomerNo(phoneNo); 
      smsDO.setSmsContent(msg); 
      smsDO.setCreatedOn(receivedOn); 
      smsDO.setStatus(1); 
      smsDO.setUpdatedOn((new Date()).toString()); 
      proFetchDAO.save(smsDO); 
      proFetchDAO.saveTwo(smsDO); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return 0; 
}} 

このDAO実装クラスでは、proFetchDAO.save(smsDO)は正常に動作しますが、proFetchDAO.saveTwo(smsDO)を実行すると、 "org.hibernate.HibernateException:現在のスレッドでセッションが見つかりません"が返されます。

スタックトレース:

Hibernate: insert into sms_log (created_by, created_on, customer_no, sms_content, status, updated_by, updated_on) values (?, ?, ?, ?, ?, ?, ?) 
org.hibernate.HibernateException: No Session found for current thread 
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) 
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:883) 
at com.sas.sakthi.rest.dao.AbstractHibernateDAOImpl.getCurrentSessionTwo(AbstractHibernateDAOImpl.java:84) 
at com.sas.sakthi.rest.dao.AbstractHibernateDAOImpl.saveTwo(AbstractHibernateDAOImpl.java:74) 
at com.sas.sakthi.rest.service.SmsLogDataFetchServiceImpl.savenewentry(SmsLogDataFetchServiceImpl.java:33) 
at com.sas.sakthi.rest.controller.SMSGatewayReceiverController.receiveGatewaySms(SMSGatewayReceiverController.java:48) 
at com.sas.sakthi.rest.controller.SMSGatewayReceiverController$$FastClassByCGLIB$$d0f8afce.invoke(<generated>) 
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96) 
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260) 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94) 
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631) 
at com.sas.sakthi.rest.controller.SMSGatewayReceiverController$$EnhancerByCGLIB$$a5284739.receiveGatewaySms(<generated>) 
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:606) 
at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60) 
at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185) 
at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) 
at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302) 
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) 
at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) 
at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) 
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1542) 
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1473) 
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419) 
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409) 
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409) 
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:540) 
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:715) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at com.thetransactioncompany.cors.CORSFilter.doFilter(CORSFilter.java:205) 
at com.thetransactioncompany.cors.CORSFilter.doFilter(CORSFilter.java:266) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
at java.lang.Thread.run(Thread.java:745) 
+0

完全なスタックトレースを投稿してください - 明示的な原因は何ですか? – rapasoft

+0

@rapasoftこんにちは、私は完全なスタックトレースを投稿しました。 –

答えて

1

オクラホマので、あなたが春の<tx:annotation-driven />を使用しているが、私は@Transactional注釈のいずれかを見ることができません。

エンティティを永続化する方法を2つの別々のものに分割し、お互いに@Transactional("transactionManager")@Transactional("transactionManagerTwo")と注釈を付けることができます。

@Transactional使用説明書をお読みください。

+0

ありがとう、それは動作します:) –

関連する問題