2009-11-26 28 views

Trả lời

4

Đảm bảo rằng bạn có giao dịch hoạt động khi tuyên bố này thực thi. Nếu bạn đang sử dụng JPA, hãy sử dụng EntityManager.getTransaction(). Begin(). Điều này giả định rằng bạn đang sử dụng JPA bên ngoài phạm vi giao dịch JTA.

Nếu bạn đang chạy ứng dụng bên trong một vùng chứa có hỗ trợ JTA, bạn cũng có thể sử dụng JTA UserTransaction để quản lý giao dịch.

1

Hãy chắc chắn rằng phương pháp xử lý của bạn được khai báo là public

@Transactional 
@RequestMapping('/test') 
public String doTest() { 
    // do your stuff here 
    return 'testview'; 
} 
+0

bro tốt bắt đầu ..! –

0

Hãy chắc chắn rằng cấu hình mùa xuân của bạn bao gồm các dòng sau:

<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager" />

mode có thể là Proxy hoặc aspectjtransaction-manager phải trỏ đến giao dịch của bạn quản lý được.

0

Tương tự đã xảy ra với tôi bằng cách sử dụng mùa xuân 3.0.0/3.0.3. Dữ liệu được lưu giữ trong MySQL từ JUnit nhưng không tồn tại từ máy chủ tomcat. Sau rất nhiều công việc tôi đã từ bỏ RESOURCE_LOCAL cho JTA.

Điều này làm việc cho tôi http://erich.soomsam.net/2007/04/24/spring-jpa-and-jta-with-hibernate-and-jotm/ Nó sử dụng JTA và phụ thuộc vào JOTM.

0

Đối với JBoss 4.0 và Hibernate, tôi cố định vấn đề này bằng cách thêm một số đặc tính quản lý giao dịch để định nghĩa EntityManagerFactoryBean tôi:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="xaDs" /> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory 
      </prop> 
      <prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup 
      </prop> 
     </props> 
    </property> 

Tôi tìm thấy soluton on this message board thread.

14

Sau khi tự mình gặp vấn đề này và dành vài giờ để giải quyết vấn đề, cuối cùng tôi đã tìm ra lý do: Spring có lỗi và không thể duy trì giao dịch với chú thích @Transactional nếu cùng một lớp có chú thích @Service cho phương tiện của autowiring.

Khi @Service chú thích đã bị xóa khỏi lớp dịch vụ trong câu hỏi, và đậu thích hợp đã được công bố trong cấu hình XML:

<bean id="myService" class="com.example.myapp.service.MyServiceImpl" /> 

vấn đề đã biến mất.

Kiểm tra điều này JIRA bug để biết thêm chi tiết.

+4

Cũng nói đây là một lỗi không hoàn toàn chính xác, liên kết bạn đã đưa ra đã giải thích tốt lý do tại sao điều này xảy ra - lớp Service nhận được instantiated như một bean trong cả appContext.xml và spring-servlet.xml. Nó sẽ chỉ nhận được 'bean'ed trong appContext.xml nếu không nó sẽ không có hỗ trợ giao dịch. –

+0

@HarshalWaghmare Bạn đã lưu đáy của tôi hai lần. Tôi đã gặp lỗi tương tự hai lần và háo hức cố tìm lại nhận xét của bạn: D. Cuối cùng, nhanh lên. Nói với servlet-context chỉ để quét các bộ điều khiển .. mọi thứ hoạt động như sự quyến rũ. – Aubergine

3

Vấn đề của tôi là làm với cách mà tôi thiết lập các <tx:annotation-driven/> phần tử trong định nghĩa ngữ cảnh của tôi -

Nguyên Tôi có thời gian tải dệt kích hoạt (không knownley) mà đọc <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/> và bằng cách đơn giản loại bỏ các thuộc tính thứ 2 - tất cả mọi thứ làm việc (mất 2 giờ đầu đập). Tôi tin rằng các yếu tố thứ 2 liên quan đến sterotype @Configurable nhưng có thể để cho khác (thông minh) người giải thích sự khác biệt & tại sao người ta có thể làm việc định nghĩa & kia làm không .. Hy vọng điều này sẽ giúp ...

làm việc = <tx:annotation-driven transaction-manager="transactionManager"/>

0

Tôi đã làm tất cả mọi thứ như sau. Vấn đề của tôi là với thẻ "import", có một số bối cảnh gốc như ngữ cảnh servlet và ngữ cảnh gốc không phụ thuộc vào nhau. Nó trở nên rõ ràng với khung nhìn Spring Explorer trong STS. Không có JTA cho Tomcat.

Lời khuyên của tôi là phổ quát: chạy Pet Clinic trên môi trường của bạn, How to run Spring 3.0 PetClinic in tomcat with Hibernate backed JPA hoặc tạo bằng trình đơn Roo và thử so sánh cấu hình của bạn với tham chiếu.

0

tôi cuối cùng đã sửa lại lỗi này bằng cách thêm

<tx:annotation-driven mode="aspectj" transaction-manager="yourTransactionManager" /> 

vào tôi ứng dụng context.xml

+0

Câu trả lời của bạn mâu thuẫn với câu trả lời của Ian. Ông đã xóa tham số chế độ = "aspectj". – Brain

2

Đảm bảo rằng bạn có một giao dịch hoạt động khi tuyên bố này được thực thi. Nếu bạn đang sử dụng JPA, hãy sử dụng EntityManager.getTransaction().begin(). Điều này giả định rằng bạn đang sử dụng JPA bên ngoài phạm vi giao dịch JTA.

2

Tôi gặp sự cố này, chỉ cần thêm chú thích @Transacctional không chỉ trên phương thức, cũng trong lớp cùng với chú thích @Service của bạn.

ví dụ:

@Service 
@Transactional 
public class MyService { 

} 
+0

Chú thích @Transactional cho lớp đã giải quyết được sự cố của tôi. – pablosaraiva

1

mùa xuân 4.3.1/Hibernate 4.2.21

cấu hình của tôi là% mã 100 Java không có ngủ đông hay mùa xuân tài liệu xml (ví dụ context.xml, persistence.xml v.v.) Vấn đề là EntityManagerFactory Tôi đã đi qua số TransactionManager, xem cấu hình bên dưới theo phương pháp transactionManager.

@Configuration 
@EnableTransactionManagement 
public class HibernateConfiguration2 { 

@Bean 
public DataSource dataSource() { 
    return ...; // Build a basic datasource 
} 

@Bean 
@Autowired 
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { 
    LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean(); 
    entityManagerFactory.setDataSource(dataSource); 
    entityManagerFactory.setPackagesToScan("nz.co.mark"); 
    entityManagerFactory.setPersistenceProviderClass(org.hibernate.ejb.HibernatePersistence.class); 

    return entityManagerFactory; 
} 

@Bean 
@Autowired 
public EntityManager entityManager(LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) { 
    EntityManager em = localContainerEntityManagerFactoryBean.getNativeEntityManagerFactory().createEntityManager(); 
    em.setFlushMode(FlushModeType.AUTO); 
    return em; 
} 

@Bean 
@Autowired 
public JpaTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean emf) throws Exception { 
    JpaTransactionManager transactionManager = new JpaTransactionManager(); 
    transactionManager.setEntityManagerFactory(emf.getObject()); 
    // The below line would generate javax.persistence.TransactionRequiredException: no transaction is in progress 
    // transactionManager.setEntityManagerFactory(emf.getNativeEntityManagerFactory()); 
    return transactionManager; 
} 
0

Tôi đã gặp vấn đề tương tự ... đã dành một vài giờ cho đến khi tôi tìm được lý do cuối cùng. Đó chỉ là một dòng mã gây ra ngoại lệ trong trường hợp của tôi ...

Trong tôi MVC-core-config.xml dòng sau là lý do:

<context:component-scan base-package="com.my.package.application" /> 

Sau Tôi đã thay đổi nó như sau, mọi thứ đã hoạt động trở lại:

<context:component-scan base-package="com.my.package.application.controller" /> 

Vì vậy, tôi đoán việc quét tất cả các gói ứng dụng của tôi thay vì chỉ các lớp @Controller dẫn đến vấn đề như @ harshal-waghmare được đề cập trong his post to another answer.

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