2016-10-03 29 views
8

1 câu hỏi nhanh về giao dịch kho lưu trữ Spring JPA. Tôi có một dịch vụ mà không được đánh dấu là giao dịch và gọi mùa xuân JPA phương pháp khoGiao dịch kho lưu trữ JPA trong mùa xuân

userRegistrationRepository.deleteByEmail(email); 

Và nó được định nghĩa là

@Repository 
public interface UserRegistrationRepository extends JpaRepository<UserRegistration, Long> { 

    UserRegistration findByEmail(String email); 

    void deleteByEmail(String email); 

} 

Vấn đề là nó không thành công với "Không EntityManager với giao dịch thực tế có sẵn cho chuỗi hiện tại - không thể xử lý cuộc gọi 'xóa' một cách đáng tin cậy; ngoại lệ lồng nhau là ngoại lệ javax.persistence.TransactionRequiredException ".

Ok, tôi có thể giải quyết nó bằng cách đánh dấu các dịch vụ haydeleteByEmail (..) phương pháp như giao dịch, nhưng tôi chỉ không thể hiểu tại sao nó bị treo bây giờ. Tài liệu mùa xuân cho biết rõ ràng rằng "phương pháp CRUD trên các phiên bản kho lưu trữ được giao dịch theo mặc định." (http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions), nhưng dường như điều này không phải là ... Vì vậy, Tuyên bố này có liên quan đến chỉ các thành viên của CrudRepository?

ps: dành cho dữ liệu Spring JPA 1.9.4

Trả lời

10

Bạn nói đúng. Chỉ có phương pháp CRUD (CrudRepository phương pháp) theo mặc định được đánh dấu là giao dịch. Nếu bạn đang sử dụng các phương thức truy vấn tùy chỉnh, bạn nên đánh dấu nó một cách rõ ràng bằng chú thích @Transactional.

@Repository 
public interface UserRegistrationRepository extends JpaRepository<UserRegistration, Long> { 

    UserRegistration findByEmail(String email); 

    @Transactional 
    void deleteByEmail(String email); 

} 

Bạn cũng nên biết về hậu quả của việc đánh dấu phương thức giao diện kho lưu trữ thay vì phương pháp dịch vụ. Nếu bạn đang sử dụng cấu hình mặc định tuyên truyền giao dịch (Propagation.REQUIRED) thì:

Cấu hình giao dịch tại các kho sẽ được bỏ qua sau đó là cấu hình giao dịch bên ngoài xác định thực tế một sử dụng.

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions

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