powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Понимание @Transactional
14 сообщений из 14, страница 1 из 1
Понимание @Transactional
    #38395002
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();

 
}
...
Рейтинг: 0 / 0
Понимание @Transactional
    #38395019
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, принципиально вы все верно поняли.
...
Рейтинг: 0 / 0
Понимание @Transactional
    #38395027
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Понимание @Transactional
    #38395351
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а будут ли когда нибудь за жизненый цикл приложения мои объекты в detached состоянии?
...
Рейтинг: 0 / 0
Понимание @Transactional
    #38395518
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Понимание @Transactional
    #38397186
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Озверин,

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

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

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

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

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

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

а везде вроде как пишут, что состояние detached после завершения session.close(). почему тут не по общему правилу?
...
Рейтинг: 0 / 0
Понимание @Transactional
    #38398550
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Понимание @Transactional
    #38405828
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Созрел ещё вопросик:
Есть ли разница между
1. помечать весь класс аннотацией @Transactional;
2. помечать все методы этой аннотацией;
?
...
Рейтинг: 0 / 0
Понимание @Transactional
    #38405877
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redwhite90Есть ли разница между
1. помечать весь класс аннотацией @Transactional;
2. помечать все методы этой аннотацией;
?
Наверное лучше пометить класс, если в этом есть смысл. А потом просто переопределять в отдельных методах, если есть такая надобность.
...
Рейтинг: 0 / 0
Понимание @Transactional
    #38405943
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
согласен.
мне тут ещё подсказали, что при наследовании если класс помечен, то потомки по дефолту тоже будут @Transactional
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Понимание @Transactional
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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