[SPRING] Spring / Hibernate / JUnit - Thread에 바인드 된 Hibernate Session 없음
SPRINGSpring / Hibernate / JUnit - Thread에 바인드 된 Hibernate Session 없음
테스트 케이스에서 현재의 최대 절전 모드 세션에 액세스하려고하는데 다음 오류가 발생합니다.
분명히 일종의 설정을 놓친 적이 있지만 확실하지 않습니다.
어떤 도움이라도 대단히 감사하겠습니다. 이것은 Hibernate / Spring 등에서의 첫 번째 균열이며, 학습 곡선은 확실히 가파른 것입니다!
코드는 다음과 같습니다.
문제가되는 수업 :
public class DbUnitUtil extends BaseDALTest {
@Test
public void exportDtd() throws Exception
{
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Connection hsqldbConnection = session.connection();
IDatabaseConnection connection = new DatabaseConnection(hsqldbConnection);
// write DTD file
FlatDtdDataSet.write(connection.createDataSet(), new FileOutputStream("test.dtd"));
}
}
기본 클래스 :
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class BaseDALTest extends AbstractJUnit4SpringContextTests {
public BaseDALTest()
{
super();
}
@Resource
protected SessionFactory sessionFactory;
}
applicationContext.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.hsqldb.jdbcDriver</value>
</property>
<property name="url">
<value>jdbc:hsqldb:mem:sample</value>
</property>
<property name="username">
<value>sa</value>
</property>
<property name="password">
<value></value>
</property>
</bean>
<bean id="sessionFactory" class="com.foo.spring.AutoAnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="entityPackages">
<list>
<value>com.sample.model</value>
</list>
</property>
<property name="schemaUpdate">
<value>true</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect
</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
</beans>
해결법
-
==============================
1.틀렸어. 그냥 세션 관리 코드로 코드를 채울거야.
틀렸어. 그냥 세션 관리 코드로 코드를 채울거야.
먼저 컨텍스트에서 트랜잭션 관리 bean을 추가하십시오.
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean>
두 번째로, AbstractTransactionalJUnit4SpringContextTests를 확장합니다.
public class BaseDALTest extends AbstractTransactionalJUnit4SpringContextTests{
세 번째로, 클래스 테스트에 주석을 달아 라.
@TransactionConfiguration @Transactional
거래 경계 설정이 정확하다면 (DAO 또는 서비스를 둘러싼 다) 수행되어야합니다.
코드 내에서 (심지어 테스트 내에서도) 세션과 트랜잭션 처리 코드를 뿌리는 것은 좋지 않습니다.
-
==============================
2.Spring 설명서를 참조하십시오. 테스트에 대한 전체 장과 트랜잭션 관리에 대한 절이 있습니다.
Spring 설명서를 참조하십시오. 테스트에 대한 전체 장과 트랜잭션 관리에 대한 절이 있습니다.
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/testing.html#testing-tx
AbstractTransactionalJUnit4SpringContextTests를 확장하여 성공했지만 해결 방법이 있습니다.
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { // DAO has access to the session through sessionFactory.getCurrentSession() myDao.findSomething(id); } });
-
==============================
3.위의 Spring 설정을 사용하면 코드를 작성하는 것만으로 충분합니다.
위의 Spring 설정을 사용하면 코드를 작성하는 것만으로 충분합니다.
Session session = sessionFactory.getCurrentSession();
테스트 할 방법과 클래스에서. 세션 관리는 Hibernate / Spring / JUnit 테스트 설정에 의해 수행된다. 나중에 실제 애플리케이션의 Hibernate / Spring 설정에서 수행된다.
이것이 내 테스트를 위해 어떻게 작동했는지입니다. 최종 웹 어플리케이션에서 자동으로 현재 웹 요청과 관련된 Hibernate 세션이 생길 것이므로 테스트에서 sessionFactory.openSession () 호출이 없어야합니다.
-
==============================
4.이봐.
이봐.
Session session = sessionFactory.getCurrentSession();
죄송합니다.
(잘못 되었기 때문에 편집하고 upvoted하는 것).
-
==============================
5.Spring은 hibernate.current_session_context_class = 쓰레드 프로퍼티 (당신은 사용하지 않음)를 무시하고 Hibernate의 SessionFactory를 여기에 설명 된 것과 같이 자신의 트랜잭션 버전으로 랩핑한다.
Spring은 hibernate.current_session_context_class = 쓰레드 프로퍼티 (당신은 사용하지 않음)를 무시하고 Hibernate의 SessionFactory를 여기에 설명 된 것과 같이 자신의 트랜잭션 버전으로 랩핑한다.
이것에 대한 해결책은 속성을 설정하는 것입니다.
<property name="exposeTransactionAwareSessionFactory"><value>false</value></property>
세션 빈 환경 설정에서
from https://stackoverflow.com/questions/734614/spring-hibernate-junit-no-hibernate-session-bound-to-thread by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring MVC requestmapping 핸들러 메소드에서 {id :. +}의 의미는 무엇입니까? (0) | 2019.02.03 |
---|---|
[SPRING] 런타임 생성자 인자를 가진 스프링 빈 (0) | 2019.02.03 |
[SPRING] Spring 보안 및 Java 구성을 사용하는 사용자 정의 인증 공급자 (0) | 2019.02.02 |
[SPRING] Spring : 클라이언트가 보낸 요청이 구문 상 올바르지 않습니다 (). (0) | 2019.02.02 |
[SPRING] 스프링 및 인터페이스 (0) | 2019.02.02 |