2012-05-05 28 views
32

Tôi nhận được ngoại lệ trên với Spring3 và Hibernte4org.hibernate.HibernateException: Không có phiên tìm thấy cho thread hiện hành

Sau đây là tập tin xml đậu của tôi

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    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-3.0.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.1.xsd"> 

    <context:annotation-config/> 


    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
     <property name="url" value="jdbc:mysql://localhost:3306/GHS"/> 
     <property name="username" value="root"/> 
     <property name="password" value="newpwd"/> 
    </bean> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="dialect">org.hibernate.dialect.MySQL5Dialect</prop> 
     </props> 
    </property> 
    <property name="packagesToScan"> 
     <list> 
      <value>com.example.ghs.model.timetable</value> 
     </list> 
    </property> 
    </bean> 

    <bean id="baseDAO" 
     class="com.example.ghs.dao.BaseDAOImpl"/> 
</beans> 

lớp BaseDAO của tôi trông như thế này

public class BaseDAOImpl implements BaseDAO{ 
private SessionFactory sessionFactory; 

@Autowired 
public BaseDAOImpl(SessionFactory sessionFactory){ 
    this.sessionFactory = sessionFactory; 
} 

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

các mã sau ném ngoại lệ trong tiêu đề

public class Main { 
public static void main(String[] args){ 
    ClassPathXmlApplicationContext context = 
      new ClassPathXmlApplicationContext("dao-beans.xml"); 
    BaseDAO bd = (BaseDAO) context.getBean("baseDAO"); 
    bd.getCurrentSession(); 
} 
} 

Có ai có ý tưởng về cách giải quyết vấn đề này không?

Trả lời

43

getCurrentSession() chỉ có ý nghĩa bên trong phạm vi giao dịch.

Bạn cần khai báo trình quản lý giao dịch thích hợp, phân định ranh giới giao dịch và thực hiện truy cập dữ liệu bên trong nó. Ví dụ: như sau:

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

.

PlatformTransactionManager ptm = context.getBean(PlatformTransactionManager.class); 
TransactionTemplate tx = new TransactionTemplate(ptm); 

tx.execute(new TransactionCallbackWithoutResult() { 
    public void doInTransactionWithoutResult(TransactionStatus status) { 
     // Perform data access here 
    } 
}); 

Xem thêm:

+0

Cảm ơn câu trả lời. Tôi sẽ xem xét các tài nguyên bạn đã liên kết ở trên. –

+4

'' cũng phải được bao gồm như được đề cập bởi [@ vishal-jagtap] (http://stackoverflow.com/questions/10459922/org-hibernate-hibernateexception-no-session-found-for -current-thread/# 16296691) –

+0

Cảm ơn bạn rất nhiều, điều này thực sự đã giúp tôi chuyển tiếp. –

-1

Gói u nào đã đặt lớp BaseDAOImpl vào .. Tôi nghĩ Nó yêu cầu tên gói tương tự với tên u đã sử dụng trong ngữ cảnh ứng dụng xml và nó cũng yêu cầu chú thích có liên quan.

24

tôi đi qua cùng một vấn đề và đã giải quyết như sau Added @Transactional trên daoImpl lớp

gia tăng quản lý trnsaction trong tập tin cấu hình:

<tx:annotation-driven/> 

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

Điều này làm việc tốt cho tôi. Đã lưu ngày của tôi. : D – wsams

+0

cảm ơn ... điều này làm việc tốt với tôi .. –

5

tôi sẽ chỉ cần thêm một cái gì đó đã cho tôi một thời gian để gỡ lỗi: đừng quên rằng một chú thích @Transactional sẽ chỉ làm việc trên phương pháp "công cộng".

Tôi đặt một số @Transactional trên "được bảo vệ" và nhận được lỗi này.

Hy vọng nó sẽ giúp :)

http://docs.spring.io/spring/docs/3.1.0.M2/spring-framework-reference/html/transaction.html

Phương pháp tầm nhìn và @Transactional

Khi sử dụng proxy, bạn nên áp dụng các chú thích @Transactional chỉ với các phương pháp với tầm nhìn công cộng. Nếu bạn đã bảo vệ chú thích, các phương thức riêng hoặc gói có thể nhìn thấy bằng chú thích @Transactional, không có lỗi nào được nêu ra, nhưng phương pháp được chú thích không hiển thị các cài đặt giao dịch được định cấu hình . Hãy xem xét việc sử dụng AspectJ (xem bên dưới) nếu bạn cần chú thích các phương pháp phi công cộng.

Các vấn đề liên quan