Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Понимание @Transactional / 14 сообщений из 14, страница 1 из 1
12.09.2013, 16:44:42
    #38395002
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Понимание @Transactional
Добрый день.

У меня имеется :
некоторый класс контроллера ControllerClass
некоторый класс сервиса Service1Class
некоторый класс сервиса Service2Class

сервисные классы помечены аннотацией @Transactional

В контроллере есть такой метод:

Код: java
1.
2.
3.
4.
5.
6.
public void foo(){
    System.out.println("1");
    Service1Class.fooMethod1();
    System.out.println("2");
    Service2Class.fooMethod2();
}


нижеприведенный код аналогичен такому если бы аннотаций @Transactional не было?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public void foo(){
    Session session = HibernateUtil.getSessionFactory().openSession();//она не тут конечно могла открыться... 
    System.out.println("1");
    
    session.beginTransaction();
    Service1Class.fooMethod1();//будем считать, что внутри используется sesion
    session.getTransaction().commit();

    System.out.println("2");

    
    session.beginTransaction();
    Service2Class.fooMethod2();//будем считать, что внутри используется sesion
    session.getTransaction().commit();

 
}
...
Рейтинг: 0 / 0
12.09.2013, 16:51:40
    #38395019
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Понимание @Transactional
Да, принципиально вы все верно поняли.
...
Рейтинг: 0 / 0
12.09.2013, 16:55:54
    #38395027
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Понимание @Transactional
redwhite90Добрый день.

У меня имеется :
некоторый класс контроллера ControllerClass
некоторый класс сервиса Service1Class
некоторый класс сервиса Service2Class

сервисные классы помечены аннотацией @Transactional

В контроллере есть такой метод:

Код: java
1.
2.
3.
4.
5.
6.
public void foo(){
    System.out.println("1");
    Service1Class.fooMethod1();
    System.out.println("2");
    Service2Class.fooMethod2();
}


нижеприведенный код аналогичен такому если бы аннотаций @Transactional не было?

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public void foo(){
    Session session = HibernateUtil.getSessionFactory().openSession();//она не тут конечно могла открыться... 
    System.out.println("1");
    
    session.beginTransaction();
    Service1Class.fooMethod1();//будем считать, что внутри используется sesion
    session.getTransaction().commit();

    System.out.println("2");

    
    session.beginTransaction();
    Service2Class.fooMethod2();//будем считать, что внутри используется sesion
    session.getTransaction().commit();

 
}



да, допустим при исключении fooMethod2, данные fooMethod1 будут в базе. Но, это с настройками по дефолту, если указать:
Код: java
1.
propagation=Propagation.REQUIRED, rollbackFor=Exception.class


то будет rollback и для fooMethod1
...
Рейтинг: 0 / 0
12.09.2013, 23:39:17
    #38395351
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Понимание @Transactional
а будут ли когда нибудь за жизненый цикл приложения мои объекты в detached состоянии?
...
Рейтинг: 0 / 0
13.09.2013, 10:03:50
    #38395518
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Понимание @Transactional
redwhite90а будут ли когда нибудь за жизненый цикл приложения мои объекты в detached состоянии?

http://www.roseindia.net/hibernate/HibernateLifeCycle.shtml

Detached State :

In this state, the persistent object is still exist after closure of the active session.
You can say detached object remains after completion of transaction .It is still represents to the valid row in the database.
In detached state, changes done by detached objects are not saved to the database.
you can not detach your persistent object explicitly. evict() method is used to detach the object from session cache.
clear() ,close() methods of session can be used to detach the persistent object.

For returning in to the persistent state, you can reattach detached object by calling methods -

update()
merge()
saveOrUpdate()
lock() - It is reattached but not saved.


Example:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Session session1=Session.getCurrentSession();

Employee employee=Session1.get(Employee.class, 2); //retrieve employee having empId 2.employee return persistent object.

session1.close(); //transition is in detached state. Hibernate no longer manages the object.

employee.setName("Ron"); //Since it is in detached state so modification is ignored by Hibernate

Session session2=SessionFactory.getCurrentSession(); //reattach the object to an open session. Return persistent object and changes is saved to the database.
session2.update(employee);

session.getTransaction.commit(); //commit the transaction
...
Рейтинг: 0 / 0
15.09.2013, 23:50:16
    #38397186
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Понимание @Transactional
Озверин,

ОзверинYou can say detached object remains after completion of transaction

можете перевести эту строку? я не совсем понял, что имеется ввиду.
...
Рейтинг: 0 / 0
16.09.2013, 16:34:37
    #38397897
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Понимание @Transactional
redwhite90Озверин,

ОзверинYou can say detached object remains after completion of transaction

можете перевести эту строку? я не совсем понял, что имеется ввиду.

я просто это понял так, что можно попросить хибернейт переводить объект в detached состояние после завершения транзакции. правильно?
...
Рейтинг: 0 / 0
16.09.2013, 17:14:23
    #38397941
javapecker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Понимание @Transactional
redwhite90,
я просто это понял так, что можно попросить хибернейт переводить объект в detached состояние после завершения транзакции. правильно?
Просить не надо, если в транзакции вы его сохранили/обновили, то после завершения транзакции у вас будет объект в состоянии detached. Если удалили в транзакции - то будет в состоянии removed.
...
Рейтинг: 0 / 0
16.09.2013, 17:26:59
    #38397955
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Понимание @Transactional
javapeckerredwhite90,
я просто это понял так, что можно попросить хибернейт переводить объект в detached состояние после завершения транзакции. правильно?
Просить не надо, если в транзакции вы его сохранили/обновили, то после завершения транзакции у вас будет объект в состоянии detached. Если удалили в транзакции - то будет в состоянии removed.

А если не вызывал update, то с момента завершения транзакции до момента закрытия сессии объект будет в персистентном состоянии?
...
Рейтинг: 0 / 0
17.09.2013, 11:35:45
    #38398522
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Понимание @Transactional
javapecker,

а везде вроде как пишут, что состояние detached после завершения session.close(). почему тут не по общему правилу?
...
Рейтинг: 0 / 0
17.09.2013, 11:46:17
    #38398550
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Понимание @Transactional
redwhite90javapecker,
а везде вроде как пишут, что состояние detached после завершения session.close(). почему тут не по общему правилу?Всего у объекта может быть 3 состояния: transient, persistent, detached. Состояния "deleted" не бывает.
Когда мы удаляем конкретный объект, то мы исходим их того, что в базе данных больше нет соответствующей записи, а следовательно, такой объект уже не может быть detached, так как detached по сути означает "есть в базе, но не подключен к сессии".
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/objectstate.html#objectstate-deleting
...
Рейтинг: 0 / 0
24.09.2013, 12:27:53
    #38405828
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Понимание @Transactional
Созрел ещё вопросик:
Есть ли разница между
1. помечать весь класс аннотацией @Transactional;
2. помечать все методы этой аннотацией;
?
...
Рейтинг: 0 / 0
24.09.2013, 12:45:52
    #38405877
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Понимание @Transactional
redwhite90Есть ли разница между
1. помечать весь класс аннотацией @Transactional;
2. помечать все методы этой аннотацией;
?
Наверное лучше пометить класс, если в этом есть смысл. А потом просто переопределять в отдельных методах, если есть такая надобность.
...
Рейтинг: 0 / 0
24.09.2013, 13:17:39
    #38405943
redwhite90
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Понимание @Transactional
Blazkowicz,
согласен.
мне тут ещё подсказали, что при наследовании если класс помечен, то потомки по дефолту тоже будут @Transactional
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Понимание @Transactional / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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