ZheFrench
ZheFrench

Reputation: 1197

Hibernate 4 + Spring 3.2 + Transaction : One Service, Several Dao , One Method

I'm a beginner in hibernate 4 & Spring 3.2 stuffs. I have read some tutorials and discussion on stack but i don't find a clear answer to my questions. And i think the best way to understand is to ask and share knowledges !

Here we go! So you create each time a Pojo, a Dao , a Service class, with methods annotated transactionnal. That's ok. I'm using Sessionfactory to handle my transaction. I'm looking for good practices.

1- If you want to use Delete Method and Save Method from the same Service, how will you do to make it works in a same transaction. When i look at the log, each method are executed in different transactions.

This SampleServiceImpl:

    @Transactional
    public void save(Sample sample){

        sampleDao.save(sample);
    }
    @Transactional
    public void delete(Sample sample){

        sampleDao.delete(sample);
    }

// A solution could be that , but not very clean...there should be an another way, no?

        @Transactional
        public void action(Sample sample){

        sampleDao.save(sample);

        sampleDao.delete(sample);
    }

2- If you want to use Delete Method and Save Method from different Services class, how will you do to make it works in a same transaction. Because each method in each service class is handled by a Transactionnal annotation. Do you create a global Service calling all subservice in one method annoted Transactional

    SampleServiceImpl:

    @Transactional
    public void save(Sample sample){

        sampleDao.save(sample);
    }

        ParcicipantServiceImpl
        @Transactional 
        public void save(Participant participant){

         participantDao.save(participant);
    }

// A solution could be that , but not very clean...there should be an another way, no?
        GlobalServiceImpl

        @Transactional 
        public void save(Participant participant,Sample sample){

         participantDao.save(participant);
                 sampleDao.save(sample);
    }

3- And the last question but not the least .If you want to use several Methods from severals service in one global transaction. Imagine you want to fill up 5 or more table in one execution of a standalone program. How is it possible because each Service to have his proper transactional method, so each time you called this method, there is a transaction.

a- I have successfully arrive to fill up two tables in a sample transaction using Mkyong tutorial and cascade property in the mapping. So i see how to make it works for one table directly joined to one another or more tables. b- But if you have a 3 tables Participant -> Samples -> Derived Products. How will you fill up the three tables in a same transaction.

I don't know if i'm clear. But i would appreciated some help or example on that from advanced users. Thanks a lot for you time.

Upvotes: 1

Views: 1094

Answers (2)

ManMohan Vyas
ManMohan Vyas

Reputation: 4062

The approch you are following is cleaner approch,

ServiceOpjects are ment to contain business logic. Hence they will always manuplate through data objects. What we do in practise is create a another layer that uses dataObjects and and other functional call of same layer. Then this all business layer is called via service layer having annotation @transactional.

Can you please mention why you think this approch is dirty??

Upvotes: 0

Yugang Zhou
Yugang Zhou

Reputation: 7283

  1. Your solution is fine, maybe this works if you want to using nested transactional methods(note I saw this solution couple days ago and didn't test it):

    < tx:annotation-driven mode="aspectj" / > < context:load-time-weaver aspectj-weaving="on"/ >

    
    @Transactional
    public void action(Sample sample){
        save(sample);
        delete(sample);
    }
  1. Transaction should propagate.

GlobalServiceImpl

@Transactional 
public void save(Participant participant,Sample sample){
     participantDao.save(participant);
     sampleServiceImpl.save(sample); 
}

Upvotes: 1

Related Questions