powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / EJB UserTransaction
11 сообщений из 11, страница 1 из 1
EJB UserTransaction
    #38191691
serega063
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, помогите разобраться с транзакциями

Есть класс
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
@Stateless(name = Loader.JNDI_NAME)
@Remote(Loader.class)
@TransactionManagement(value = TransactionManagementType.BEAN)
public class LoaderBean extends AbstractLoaderBean implements Loader {
    @Override
    public List loadReports(UUID uuid, DateTime beginDate, DateTime endDate) {
        UserTransaction utx = null;
        
        try {
            InitialContext ctx = new InitialContext();
            utx = (UserTransaction) ctx.lookup("UserTransaction");
            utx.begin();
            int status = utx.getStatus(); //0
        } catch (NamingException e) {
            e.printStackTrace(); 
        } catch (NotSupportedException e) {
            e.printStackTrace(); 
        } catch (SystemException e) {
            e.printStackTrace(); 
        }


        try {                    
            deleteQuery.executeUpdate(); // ТУТ вылетает ошибка javax.persistence.TransactionRequiredException: Executing an update/delete query
            code = insertQuery.executeUpdate();

            utx.commit();                      
        } catch (Exception e) {
            utx.rollback();
            
        }

    }


}




persistence.xml
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/persistence" xsi:schemalocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="PersistenceCore" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:/MSSQLDS</jta-data-source>
       
        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
           


            <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
            <property name="hibernate.transaction.auto_close_session" value="true"/>



        </properties>
    </persistence-unit>
</persistence>
...
Рейтинг: 0 / 0
EJB UserTransaction
    #38191704
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где EntityManager? Как создаётся?
...
Рейтинг: 0 / 0
EJB UserTransaction
    #38191731
serega063
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

А хз где он создается))
так то есть класс
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
public class AbstractEntityBean {
    public EntityManager getEntityManager() {
        return em;
    }

    public void setEntityManager(EntityManager em) {
        this.em = em;
    }

    @PersistenceContext(unitName = EPConstants.CORE_PERSISTENCE_UNIT)
    protected EntityManager em;
}




Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
    public List loadReports(UUID uuid, DateTime beginDate, DateTime endDate) {
        EntityManager em = getEntityManager(); // ТУТ EntityManager 
        String deleteSQL = "delete from [dbo].[sell]";
        Query deleteQuery = em.createNativeQuery(deleteSQL);


        UserTransaction utx = null;
        
        try {
            InitialContext ctx = new InitialContext();
            utx = (UserTransaction) ctx.lookup("UserTransaction");
            utx.begin();
            int status = utx.getStatus(); //0
        } catch (NamingException e) {
            e.printStackTrace(); 
        } catch (NotSupportedException e) {
            e.printStackTrace(); 
        } catch (SystemException e) {
            e.printStackTrace(); 
        }


        try {                    
            deleteQuery.executeUpdate(); // ТУТ вылетает ошибка javax.persistence.TransactionRequiredException: Executing an update/delete query
            code = insertQuery.executeUpdate();

            utx.commit();                      
        } catch (Exception e) {
            utx.rollback();
            
        }

    }



Чую что нужно скрестить EntityManager с UserTransaction ??
...
Рейтинг: 0 / 0
EJB UserTransaction
    #38191740
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serega063Чую что нужно скрестить EntityManager с UserTransaction ??
Я не гуру в EJB, но первое что я бы попробовал - инжектить EntityManagerFactory, вместо EntityManager. Затем создавать EntityManager из Factory после utx.begin();
...
Рейтинг: 0 / 0
EJB UserTransaction
    #38191756
serega063
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
попробывал em.joinTransaction();
результат тот же
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 try {
            InitialContext ctx = new InitialContext();
            utx = (UserTransaction) ctx.lookup("UserTransaction");
            utx.begin();
            em.joinTransaction();
            int status = utx.getStatus(); //0
        } catch (NamingException e) {
            e.printStackTrace();
        } catch (NotSupportedException e) {
            e.printStackTrace();
        } catch (SystemException e) {
            e.printStackTrace();
        }
...
Рейтинг: 0 / 0
EJB UserTransaction
    #38191817
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
serega063Blazkowicz,
попробывал em.joinTransaction();
результат тот же
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 try {
            InitialContext ctx = new InitialContext();
            utx = (UserTransaction) ctx.lookup("UserTransaction");
            utx.begin();
            em.joinTransaction();
            int status = utx.getStatus(); //0
        } catch (NamingException e) {
            e.printStackTrace();
        } catch (NotSupportedException e) {
            e.printStackTrace();
        } catch (SystemException e) {
            e.printStackTrace();
        }


Так какие эксепшены срутся? У тебя при обработке исключений просто принт стек трейс, а выполнение кода продолджается. Если был эксепшн - естсевенно транзакция не создалась
...
Рейтинг: 0 / 0
EJB UserTransaction
    #38191838
serega063
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
забыл ник,
Вот модернизированный код
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
@Stateless(name = Loader.JNDI_NAME)
@Remote(Loader.class)
@TransactionManagement(value = TransactionManagementType.BEAN)
public class LoaderBean extends AbstractLoaderBean implements Loader {
    @Override
    public List loadReports(UUID uuid, DateTime beginDate, DateTime endDate) {
       
        EntityManager em = getEntityManager();

        String deleteSQL = "delete from [dbo].[sell]";
        UserTransaction utx = null;
        
        Query deleteQuery = em.createNativeQuery(deleteSQL);

        try {
            InitialContext ctx = new InitialContext();
            utx = (UserTransaction) ctx.lookup("UserTransaction");
            utx.begin();
            em.joinTransaction();
            int status = utx.getStatus(); //0
        } catch (NamingException e) {
            e.printStackTrace();
            return null;
        } catch (NotSupportedException e) {
            e.printStackTrace();
            return null;
        } catch (SystemException e) {
            e.printStackTrace();
            return null;
        }



        try {                    
            deleteQuery.executeUpdate(); // ТУТ вылетает ошибка javax.persistence.TransactionRequiredException: Executing an update/delete query
            code = insertQuery.executeUpdate();

            utx.commit();                      
        } catch (Exception e) {
            utx.rollback();
            
        }

    }


}
...
Рейтинг: 0 / 0
EJB UserTransaction
    #38191854
serega063
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ошибку возбуждает вот эта хня. Т.е. заходит в
Код: java
1.
2.
3.
4.
if ( ! em.isTransactionInProgress() ) {
				em.throwPersistenceException( new TransactionRequiredException( "Executing an update/delete query" ) );
				return 0;
			}


em.isTransactionInProgress() == false

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
package org.hibernate.ejb;

public class QueryImpl implements Query, HibernateQuery {
public int executeUpdate() {
		try {
			if ( ! em.isTransactionInProgress() ) {
				em.throwPersistenceException( new TransactionRequiredException( "Executing an update/delete query" ) );
				return 0;
			}
			return query.executeUpdate();
		}
		catch (QueryExecutionRequestException he) {
			throw new IllegalStateException(he);
		}
		catch( TypeMismatchException e ) {
			throw new IllegalArgumentException(e);
		}
		catch (HibernateException he) {
			em.throwPersistenceException( he );
			return 0;
		}
	}
}
...
Рейтинг: 0 / 0
EJB UserTransaction
    #38192226
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
serega063,

Не заморачивайтесь с TransactionManagementType.BEAN. Достаточно вынести всю логику, которая должна выполняться в своей транзакции в отдельный бин и пометить его с TransactionAttribute.REQUIRES_NEW.
...
Рейтинг: 0 / 0
EJB UserTransaction
    #38192532
serega063
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WGAserega063,

Не заморачивайтесь с TransactionManagementType.BEAN. Достаточно вынести всю логику, которая должна выполняться в своей транзакции в отдельный бин и пометить его с TransactionAttribute.REQUIRES_NEW.

Спасибо, а можно примерчик, если не долго и не далеко
...
Рейтинг: 0 / 0
EJB UserTransaction
    #38192732
WGA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
WGA
Гость
serega063Спасибо, а можно примерчик, если не долго и не далекоДа пожалуйста.
Листинг
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
@Stateless
public class Bean1 {

    @PersistenceContext
    private EntityManager em;
    @EJB
    private Bean2 bean2;

    public void method() {
        em.persist(new Response("request" + Bean2.getCounter()));
        bean2.method();
        throw new RuntimeException();
    }
}

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
@Stateless
public class Bean2 {

    private static int counter = 0;

    @PersistenceContext
    private EntityManager em;

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void method() {
        em.persist(new Request("request" + counter));
    }

    public static int getCounter() {
        return ++counter;
    }
}

Исходники тестового проекта прилагаются. Запуск приложения из браузера по контекстному пути /test-app/test. Увидите 500-ю ошибку. В БД появятся записи в таблице request, в response - нет, поскольку RuntimeException откатывает активную транзакцию. Это доказывает, что методы бинов выполняются в различных Persistence Context и, соответственно, в разных транзакциях.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / EJB UserTransaction
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]