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

Есть класс
Код: 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
20.03.2013, 16:37:33
    #38191704
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EJB UserTransaction
Где EntityManager? Как создаётся?
...
Рейтинг: 0 / 0
20.03.2013, 16:47:24
    #38191731
serega063
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EJB UserTransaction
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
20.03.2013, 16:49:47
    #38191740
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EJB UserTransaction
serega063Чую что нужно скрестить EntityManager с UserTransaction ??
Я не гуру в EJB, но первое что я бы попробовал - инжектить EntityManagerFactory, вместо EntityManager. Затем создавать EntityManager из Factory после utx.begin();
...
Рейтинг: 0 / 0
20.03.2013, 16:55:26
    #38191756
serega063
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EJB UserTransaction
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
20.03.2013, 17:22:47
    #38191817
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EJB UserTransaction
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
20.03.2013, 17:32:10
    #38191838
serega063
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EJB UserTransaction
забыл ник,
Вот модернизированный код
Код: 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
20.03.2013, 17:40:03
    #38191854
serega063
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EJB UserTransaction
Ошибку возбуждает вот эта хня. Т.е. заходит в
Код: 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
20.03.2013, 21:32:21
    #38192226
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EJB UserTransaction
serega063,

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

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

Спасибо, а можно примерчик, если не долго и не далеко
...
Рейтинг: 0 / 0
21.03.2013, 10:59:06
    #38192732
WGA
WGA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EJB UserTransaction
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
Форумы / Java [игнор отключен] [закрыт для гостей] / EJB UserTransaction / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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