Tôi có một ứng dụng được xây dựng vào Mùa xuân. Tôi để cho mùa xuân làm tất cả các phép thuật @Transactional
và tất cả mọi thứ hoạt động tốt miễn là tôi hoạt động trên các thực thể của tôi được ánh xạ tới các đối tượng Java.Cách thực hiện truy vấn SQL tùy chỉnh với giao dịch được quản lý bằng mùa xuân EntityManager
Tuy nhiên, khi tôi muốn thực hiện một số công việc tùy chỉnh trên một bảng không được ánh xạ tới bất kỳ thực thể Java nào của tôi, tôi bị kẹt. Một số thời gian trước đây, tôi tìm thấy một giải pháp để thực hiện một truy vấn tùy chỉnh như thế này:
// em is instance of EntityManager
em.getTransaction().begin();
Statement st = em.unwrap(Connection.class).createStatement();
ResultSet rs = st.executeQuery("SELECT custom FROM my_data");
em.getTransaction().commit();
Khi tôi thử điều này với người quản lý thực thể tiêm từ mùa xuân với @PersistenceContext
chú thích, tôi nhận được ngoại lệ gần như rõ ràng:
java.lang.IllegalStateException:
Not allowed to create transaction on shared EntityManager -
use Spring transactions or EJB CMT instead
Cuối cùng tôi quản lý để giải nén quản lý Entity không chia sẻ như thế này:
@Inject
public void myCustomSqlExecutor(EntityManagerFactory emf){
EntityManager em = emf.createEntityManager();
// the em.unwrap(...) stuff from above works fine here
}
Tuy nhiên, tôi tìm thấy giải pháp này không phải cảm thấy thoải mái và cũng không e legant. Tôi tự hỏi liệu có cách nào khác để chạy các truy vấn SQL tùy chỉnh trong môi trường hướng-giao dịch mùa xuân này không?
Đối với những người tò mò - vấn đề này xuất hiện khi tôi cố gắng tạo tài khoản người dùng trong ứng dụng của tôi và trong diễn đàn liên quan cùng một lúc - Tôi không muốn bảng người dùng của diễn đàn được ánh xạ tới bất kỳ thực thể Java nào của tôi.
Điều này không rõ ràng bạn làm gì với CMT và BMT ở cùng một nơi. –