Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по JPA 2 и EntityManager / 9 сообщений из 9, страница 1 из 1
29.04.2013, 10:41:42
    #38243569
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по JPA 2 и EntityManager
всем добрый день , читаю книгу

Pro JPA 2 Mastering the Java™ Persistence API Mike Keith and Merrick Schnicariol

Книга на англйском , и во по главе номер 6 возникли вопросы по EntityManager.

Немного запутался в транзакциях и контекстах ,
кто может помогите разобраться и разложить знания по полочкам для полного понимания:
1)
Код: 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.
@PersistenceContext

в PersistenceContextType  есть два типа 

 PersistenceContextType {

    TRANSACTION, EXTENDED;
}

когда что используется ?


в Connection есть такие уровни  изоляции транзакции 

TRANSACTION_READ_UNCOMMITTED
TRANSACTION_READ_COMMITTED
TRANSACTION_REPEATABLE_READ
TRANSACTION_SERIALIZABLE
TRANSACTION_NONE

есть грязное , фантомное чтение итд 

как это все соотносится с 

@TransactionAttribute

с типами : 

TransactionAttributeType

 MANDATORY, REQUIRED, REQUIRES_NEW, SUPPORTS, NOT_SUPPORTED, NEVER;


вопрос два : когда используется

@Resource UserTransaction tx;

в сервлетах? к примеру есть у нас простой


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@Stateless
public class EmployeeServiceBean implements EmployeeService {
@PersistenceContext(unitName="EmployeeService")
private EntityManager em;
public List findAll() {
return em.createQuery("SELECT e FROM Employee e")
.getResultList();
}
// ...
}



Мы можем написать в сервлет таким образом :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class EmployeeServlet extends HttpServlet {
@EJB EmployeeService bean;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List emps = bean.findAll();
request.setAttribute("employees", emps);
getServletContext().getRequestDispatcher("/listEmployees.jsp")
.forward(request, response);
}
}



а можем и так :

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public class EmployeeServlet extends HttpServlet {
@Resource UserTransaction tx;
@EJB EmployeeService bean;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// ...
try {
tx.begin();
List emps = bean.findAll();
request.setAttribute("employees", emps);
getServletContext().getRequestDispatcher("/listEmployees.jsp")
.forward(request, response);
} finally {
tx.commit();
}
// ...
}
}



или через

Код: java
1.
2.
3.
4.
5.
em.getTransaction().begin();
... 
List emps = bean.findAll();
...
em.getTransaction().commit();



в чем будет разница ??

или к примеру

в каких случаях вместо Stateless нужно использовать Stateful
да к тому же устанавливая ему время жизни - ограничивая временем жизни генерации jsp страницы ?


когда нужно просто в сервлете инжектить Stateless бин !

а когда помещать в сервлет

Код: java
1.
2.
@PersistenceUnit(unitName="EmployeeService")
EntityManagerFactory emf;



и искать entity через EntityManager ?
Код: java
1.
2.
3.
4.
// check valid user
EntityManager em = emf.createEntityManager();
User user = em.find(User.class, userId);
em.close();



Это дает какую то выгоду (время, скорость , производительность )? по сравнению с @EJB EmployeeService bean; в сервлете ?

от такого разнообразия вариантов - совсем запутался !


и так еще раз : вопрос по поводу когда что использовать в области TransactionAttributeType ?

когда использовать в сервлете em.getTransaction().begin(); em.getTransaction().commit(); когда можно обойтись без оного , а когда использовать UserTransaction tx ;

и в чем смысл использовать Stateful с ограниченым временем жизни - вместо Stateless ?
...
Рейтинг: 0 / 0
29.04.2013, 11:10:55
    #38243619
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по JPA 2 и EntityManager
Atum1,
1. Про уровни изоляции забудь. Будет исп-ться уровень по умолчанию СУБД. В 99,9 проц. этого достаточно.
Её практисчески никто не переключает.
2. Строки begin....end обычно лень писать. Поэтому придумали декларативно через аннотации
3. Испрользовать UserTransaction _с клиента_ только тогда, когда надо что либо отменять (rollback) по бизнес-логике.
...
Рейтинг: 0 / 0
29.04.2013, 12:04:19
    #38243717
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по JPA 2 и EntityManager
Petro123Atum1,
1. Про уровни изоляции забудь. Будет исп-ться уровень по умолчанию СУБД. В 99,9 проц. этого достаточно.
Её практисчески никто не переключает.
2. Строки begin....end обычно лень писать. Поэтому придумали декларативно через аннотации
3. Испрользовать UserTransaction _с клиента_ только тогда, когда надо что либо отменять (rollback) по бизнес-логике.

ок! Спасибо! :)

а по поводу
TransactionAttributeType
по умолчанию REQUIRED т.е любой вызов EntityManager бина и его методов - это новый контекст транзакции. когда должно быть понимания использовать отличный от этого атрибут? в чем будет экономия ?




и зачем тогда городить велосипед с Stateful ? указывая ему EXTENDED и Remove


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
@Stateful
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public class EmployeeQueryBean implements EmployeeQuery {
@PersistenceContext(type=PersistenceContextType.EXTENDED,
unitName="EmployeeService")
EntityManager em;
public List findAll() {
return em.createQuery("SELECT e FROM Employee e")
.getResultList();
}
// ...
@Remove
public void finished() {
}
}



и Сервлет с

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
@EJB(name="queryBean", beanInterface=EmployeeQuery.class)
public class EmployeeServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
EmployeeQuery bean = createQueryBean();
try {
List emps = bean.findAll();
request.setAttribute("employees", emps);
getServletContext().getRequestDispatcher("/listEmployees.jsp")
.forward(request, response);
} finally {
bean.finished();
}
}
private EmployeeQuery createQueryBean() throws ServletException {
// look up queryBean
// ...
}
}



в чем профит по сравнению со Stateless ? без всего этого ?
...
Рейтинг: 0 / 0
29.04.2013, 12:50:01
    #38243833
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по JPA 2 и EntityManager
Atum1по умолчанию REQUIRED т.е любой вызов EntityManager бина и его методов - это новый контекст транзакции.
не верно - поищи в сети.
В общем случае вопрос равен:
- когда свою функцию ABC{}
писать перед:
Код: java
1.
2.
beginTranzactin
  try


- внутри?
- и после?
Ответ - по бизнес-логике.
Или сначала достаточно REQUIRED.
Т.е. если бы ты руками писал try то ты бы сам видел по стеку когда стартовать транзакцию.
Контейнер это не знает, поэтому аннотации - это ему подсказки.
...
Рейтинг: 0 / 0
29.04.2013, 14:13:05
    #38243950
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по JPA 2 и EntityManager
погуглил , почитал , нашел это

Транзакционные стратегии

http://www.k-press.ru/cs/2009/1/ts/ts.asp

и это


http://onedeveloper.ru/article?id=9

Код: java
1.
2.
3.
4.
5.
6.
Required	Методы выполняются внутри транзакции. Если клиент ассоциирован с транзакцией, то используется эта транзакция. Если нет, генерируется новая транзакция. Происходит коммит в конце метода, который означает, что метод, имеющий включенный атрибут required, вызванный ранее, когда транзакция уже была начата, не будет вкоммичен по завершении метода.


 RequiresNew	Методы выполняются внутри транзакции. Если клиент предоставляет транзакцию, она приостанавливается. Если нет – генерируется новая транзакция. Коммит в конце метода. Приостановленная транзакция восстанавливается после завершения основной. Используйте этот атрибут, если хотите, чтобы метод всегда выполнялся в новой транзакции.

Mandatory	Если клиент выполняется внутри транзакции и вызывает метод корпоративного бина, метод выполняется в клиентской транзакции. Если клиент не ассоциирован с транзакцией, контейнер выбрасывает TransactionRequiredException.



может кому-то будет полезно.
...
Рейтинг: 0 / 0
29.04.2013, 14:24:04
    #38243959
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по JPA 2 и EntityManager
В связи с чем возник одни хороший вопрос :

транзакционная стратегия проекта

как грамотно ее организовать ?

Зависит все от бизнес логики и от целей :

как мне кажется правильный стиль это указывать над бинами стратегии по умолчанию , чтобы указать для остальных разработчиков важность этого момента и заставить обращать на него внимание.
...
Рейтинг: 0 / 0
29.04.2013, 14:29:04
    #38243967
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по JPA 2 и EntityManager
Atum1,
вот аннотации стратегии проекта - нету)))))
Там в статье всё написано. Нет золотой пули.
- CRUD. Транзакции как можно короче. Тогда и откат не нужен).
Всё.
...
Рейтинг: 0 / 0
20.06.2013, 10:38:02
    #38304308
Atum1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по JPA 2 и EntityManager
возник очередной вопрос :

по оформлению кода

и так есть класс sevice,
если я использую спринг нужно ли указывать session.beginTransaction();
или достаточно аннотации @Transactional(readOnly = true, ?


мы лишь только читаем фирмы из базы.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
@Service
public class CompanyServiceImpl implements TCompanyService {

    @Autowired
    private SessionFactory sessionFactory;


    @Override
    @Transactional(readOnly = true, propagation = Propagation.NOT_SUPPORTED)
    public List<Company> getCompanys() {
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        
        Query  query = session.createQuery("SELECT c FROM Company");
        query.setCacheable(true);
        List<Company> result =  query.list();

        session.close();
        session = null;
        
        return result;
    }   
        
...
Рейтинг: 0 / 0
20.06.2013, 11:26:50
    #38304391
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по JPA 2 и EntityManager
Atum1,
imho
- у вас ПРОСТЕЙШАЯ стратегия транзакций.
Поэтому ничего не стартовать, не отменять, и не ставить аннотации. Сервер+спринг сам разберётся при таком простом клиенте.
Ну и, выше написано, стартую рукми при НЕдекларативном подходе.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Вопрос по JPA 2 и EntityManager / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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