I prefer to demarcate transactions in abstract "command" or "action" :
Code:
public abstract class Action {
protected abstract void execute();
public final void run(){
//BEGIN TRANSACTION
execute();
//END TRANSACTION, CLOSE SESSION
}
}
Code:
public final class MyAction extends Action{
protected void execute(){
// this is a Java Studio Creator App
MyBussinessClass.bussinessMethod1();
MyBussinessClass.bussinessMethod2();
}
}
Code:
public final class MyAction2 extends Action{
private Long id;
public MyAction2(Long id){
this.id = id;
}
protected void execute(){
Session session = HibernateUtil.getCurrentSession();
// Load persistent object
MyDTO dto = (MyDTO)session.get(MyDTO.class, id);
// calculate some value for some property
SomeValue someValue = calculateSomeValue();
dto.setSomeValue(someValue);
// do more things
...
}
}
some static utility is fine too:
Code:
static void excuteAction( Action action){
//BEGIN TRANSACTION
action.execute();
//END TRANSACTION, CLOSE SESSION
}
it helps, if you need compound commands:
Code:
public final class CompoundAction extends Action{
public CompoundAction(Action actions[]){
....
}
protected void execute(){
for(Action action: actions ){
action.run();// no transaction demarcation in base class,"excuteAction" demarcates transactions
}
}
}
This is classic "Command" design pattern.