У меня есть приложение, построенное на Spring. Я позволяю Spring делать все волшебство @Transactional
, и все работает отлично, пока я работаю над объектами, которые отображаются на объекты Java.Как выполнить пользовательский SQL-запрос с управляемой транзакцией транзакций EntityManager
Однако, когда я хочу выполнить какое-то пользовательское задание в таблице, которая не сопоставлена ни с одним из моих объектов Java, я застрял. Некоторое время назад, я нашел решение, чтобы выполнить пользовательский запрос, как это:
// 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();
Когда я пытаюсь это с менеджером объекта, впрыскиваемого из Spring с @PersistenceContext
аннотацию, я получаю почти очевидное исключение:
java.lang.IllegalStateException:
Not allowed to create transaction on shared EntityManager -
use Spring transactions or EJB CMT instead
я, наконец, удалось извлечь неразделяемую Entity менеджер вроде этого:
@Inject
public void myCustomSqlExecutor(EntityManagerFactory emf){
EntityManager em = emf.createEntityManager();
// the em.unwrap(...) stuff from above works fine here
}
тем не менее, я считаю, это решение ни комфортный, ни электронной legant. Мне просто интересно, есть ли какой-либо другой способ запуска пользовательских SQL-запросов в этой среде с Spring-транзакцией?
Для тех, кому это любопытно, эта проблема возникла, когда я попытался создать учетные записи пользователей в своем приложении и в соответствующем форуме сразу - я не хотел, чтобы таблица пользователей форума отображалась на любом из моих объектов Java.
Непонятно, что вы возили CMT и BMT в одном и том же месте. –