2012-10-17 22 views
6

Tôi đã gặp vấn đề về sự tồn tại của phần tử với cơ sở dữ liệu bằng EntityManager. Dựa trên những câu trả lời tôi tìm thấy, tôi đã thử 4 cách đó trong DaoJpa của tôi để làm điều đó nhưng vẫn thất bại. Ở đây tôi kèm theo bốn cách tôi đã cố gắng:EntityManager không thể sử dụng lâu dài để lưu phần tử vào cơ sở dữ liệu

Mã trong điều khiển phần:

@Transactional 
    SmartProduct smartProduct = new SmartProduct(); 
      smartProduct.setName("Dove Soap"); 
      smartProductDao.persist(smartProduct); 

1. DaoJpa:

@Transactional 
public void persist(SmartProduct smartProduct) { 
      entityManager.persist(smartProduct); 

Không hoạt động!

2.

@Transactional 
public void persist(SmartProduct smartProduct) { 
entityManager.persist(smartProduct); 
entityManager.flush(); 

Exception tôi nhận: không có giao dịch là cơ bản dở dang

3.

@Transactional 
public void persist(SmartProduct smartProduct) { 
EntityTransaction emTransaction = entityManager.getTransaction(); 
     emTransaction.begin(); 
     entityManager.persist(smartProduct); 
     emTransaction.commit(); 
     entityManager.close(); 

Exception tôi nhận: Không được phép tạo giao dịch trên EntityMa được chia sẻ nager - sử dụng mùa xuân giao dịch hoặc EJB CMT thay

4.

@Transactional 
public void persist(SmartProduct smartProduct) { 
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnit"); 
       EntityManager em = emf.createEntityManager(); 
       EntityTransaction etx = em.getTransaction(); 
       etx.begin(); 
       em.persist(smartProduct); 
       etx.commit(); 
       em.close(); 
       emf.close(); 

Exception tôi nhận: Các ứng dụng phải cung cấp kết nối JDBC

một người nào đó có thể giúp tôi tìm ra vấn đề xin vui lòng? Rất cám ơn trước!

Rất cám ơn sự trợ giúp của JustinKSU. Tôi thêm chú thích trong bối cảnh mùa xuân và sau đó nó được giải quyết! Đây là phiên bản trước của bối cảnh mùa xuân của tôi:

<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

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

    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
     <property name="persistenceUnitName" value="persistenceUnit" /> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

Sau khi thêm

<tx:annotation-driven /> 

nó hoạt động:

<tx:annotation-driven /> 
    <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

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

    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
     <property name="persistenceUnitName" value="persistenceUnit" /> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 
+1

Bạn đã thử sử dụng @Transactional trên phương pháp tồn tại chưa? – JustinKSU

+0

Xin lỗi tôi quên đề cập đến nó trong bài viết. Có, tôi đã thêm @Transactional trước phương thức theo tất cả bốn cách. Ngoài ra tôi đã cố gắng để thêm (readOnly = true)/(readOnly = false) sau khi chú thích giao dịch, và thậm chí thêm (propagation = Propagation.REQUIRED) là tốt, nhưng dường như không có sự khác biệt. –

+0

Bạn có đang sử dụng @PersistenceContext để tiêm thực thểManager không? – JustinKSU

Trả lời

9

Để kích hoạt @Transactional trong bối cảnh mùa xuân của bạn, bạn nên có như sau:

Phù hợp với phiên bản của bạn của Mùa xuân:

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"> 

Kích hoạt tính năng chú thích:

<tx:annotation-driven /> 

Khai quản lý giao dịch của bạn tiêm quản lý tổ chức của bạn:

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 
+0

Tôi thấy rằng chú thích trong ngữ cảnh mùa xuân của tôi giống như sau: tôi có nên sửa đổi bất kỳ chú thích nào trong phần này không ? –

+3

Thử xóa tham số chế độ khi đang ở chế độ mặc định = "proxy" – JustinKSU

+0

Wow Cảm ơn bạn rất nhiều @JustinKSU Tôi đã giải quyết được vấn đề ngay bây giờ! Đó chính là vấn đề của chú thích! Có lẽ tôi nên đính kèm nội dung của bối cảnh mùa xuân của tôi dưới đây để giúp những người khác cũng có thể gặp vấn đề tương tự. Dù sao, nhiều người cảm ơn rất nhiều cho sự giúp đỡ của bạn! –

1

Nếu bạn vẫn còn có vấn đề này và tất cả các cấu hình là ok, hãy chắc chắn phương thức chú thích @Transaction là công khai, không được bảo vệ để được quản lý giao dịch xác định/quản lý.

+0

Theo đoạn mã trong bài đăng của OP, tất cả các phương thức đều là ' công khai'. Nó cũng nói rằng khi thêm '' giải quyết vấn đề. Tôi không thấy câu trả lời của bạn thêm gì vào cuộc thảo luận. – bhantol

+2

Có lẽ câu trả lời này có thể giúp các nhà phát triển khác?! – Criss

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