@Transactional(readOnly=true, propagation=Propagation.SUPPORTS) looks like
the best solution.

Dissecting that suggestion according to the article:

*@Transactional* so that hibernate is happen and has its endpoints
*readOnly=true* so that a database write doesn't occur
*Propogation.SUPPORTS* so that the transaction is never really started
unless asked for

Did you confirm this still works with hibernate? (validating my first
assumption above about @Transactional?)

All read/write methods will need
@Transaction(propogration=Propogration.REQUIRED)

Ben

On Sun, Feb 26, 2012 at 7:22 AM, Rafal Korytkowski <[email protected]>wrote:

> I'd vote to put @Transactional(readOnly=true,
> propagation=Propagation.SUPPORTS) at the class level of service layer impls
> and fine tune methods that aren't read only.
>
> Propagation.SUPPORTS allows to eliminate the transaction overhead that
> Darius is hoping to achieve with the DAO example in a more general and
> nicer way. More info here [0].
>
> There's not much difference between having transactional DAOs and
> Services. The latter is more widely used for the reason I gave, but it's a
> matter of taste.
>
> -Rafal
>
> [0] - http://www.ibm.com/developerworks/java/library/j-ts1/index.html
>
>
> On 24 February 2012 22:00, Darius Jazayeri <[email protected]>wrote:
>
>> Spring tries to use the existing transaction unless you say
>> @Transactional(propagation=Propagation.REQUIRES_NEW).
>>
>> I would *love* to get rid of the @Transactional annotations on our
>> services, and just put annotations on the methods that actually require
>> them.
>>
>> -Darius
>>
>>
>> On Fri, Feb 24, 2012 at 12:32 PM, Ben Wolfe <[email protected]> wrote:
>>
>>> FYI, here is the relevant ticket:
>>> https://tickets.openmrs.org/browse/TRUNK-208
>>>
>>> I could live with it on the DAO if we also examine all serviceimpls for
>>> multiple calls to the DAO layer and add the annotation to the impl if it
>>> does more than one.
>>>
>>> Can we do away with the generic @Transactional on the class and force
>>> devs to add @Transactional on methods that need it?  This should remove the
>>> need for @Transactional(readOnly=true) and limit the number of times its
>>> forgotten.  Alternatively, we make the class level annotation readOnly=true.
>>>
>>> Are we also sure that if a transaction is started at the service layer
>>> that the DAO layer is using that same one instead of starting a new one?
>>>
>>> Ben
>>>
>>>
>>> On Fri, Feb 24, 2012 at 3:13 PM, Darius Jazayeri <
>>> [email protected]> wrote:
>>>
>>>> The reason I'd rather have them in the HibernateDAO is so we can write
>>>> a service method like this, without paying the transactional penalty:
>>>>
>>>> public MySettings getSettings() {
>>>>     if (cached == null) {
>>>>         cached = dao.getSettings(); // this method has an
>>>> @Transactional annotation
>>>>     }
>>>>     return cached;
>>>> }
>>>>
>>>> Basically I'm saying that the transactional annotation should be put in
>>>> the concrete DAO only where we actually hit a transactional datastore.
>>>>
>>>> If we're putting the annotations in the ServiceImpl I'd need to do
>>>> something like this:
>>>>
>>>> public MySettings getSettings() {
>>>>     if (cached == null) {
>>>>         cached = getSettingsFromDao();
>>>>     }
>>>>     return cached;
>>>> }
>>>>
>>>> @Transactional(readOnly=true)
>>>> private MySettings getSettingsFromDao() {
>>>>     return dao.getSettings();
>>>> }
>>>>
>>>> It's not the end of the world to have to do that, but is there any
>>>> theoretical justification or best-practice recommendation that says we
>>>> should put annotations in the service layer when we believe that we're
>>>> calling a transactional DAO, rather than in the DAO layer when we know for
>>>> sure we're hitting the datastore?
>>>>
>>>> -Darius
>>>>
>>>> PS- Definitely if a ServiceImpl or a Controller method is going to make
>>>> multiple Service or DAO calls, it should explicitly mark the transaction
>>>> itself. But that's independent.
>>>>
>>>>
>>>> On Fri, Feb 24, 2012 at 10:08 AM, Ben Wolfe <[email protected]> wrote:
>>>>
>>>>> Yes, lets move these to the ServiceImpl.  Do we have a ticket
>>>>> somewhere to move the rest of our transaction annotations from interface 
>>>>> to
>>>>> impl?
>>>>>
>>>>> Ben
>>>>>
>>>>>
>>>>> On Fri, Feb 24, 2012 at 9:55 AM, Wyclif Luyima <[email protected]>wrote:
>>>>>
>>>>>> @Rafal, i agree with what you are saying, so we should move them from
>>>>>> HibernateVisitDao to VisitServiceImpl?
>>>>>>
>>>>>> Wyclif
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Fri, Feb 24, 2012 at 5:15 AM, Rafal Korytkowski <[email protected]
>>>>>> > wrote:
>>>>>>
>>>>>>> I've found a way to have the advice around @Transactional so we
>>>>>>> don't need to change anything in Visits.
>>>>>>>
>>>>>>> Anyway, I don't think we should move @Transactional to the DAO
>>>>>>> layer. In general it's the service layer that defines units of work that
>>>>>>> should be transactional. If you have multiple calls to DAO in a service
>>>>>>> method, you will want to have @Transactional in the service method 
>>>>>>> anyway.
>>>>>>>
>>>>>>> -Rafal
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On 24 February 2012 03:11, Darius Jazayeri <[email protected]>wrote:
>>>>>>>
>>>>>>>> Moving this to the dev list.
>>>>>>>>
>>>>>>>> Wyclif, I assume that you mean from HibernateVisitDAO to
>>>>>>>> VisitServiceImpl...
>>>>>>>>
>>>>>>>> So, in the long run, we need to move the transactional annotations
>>>>>>>> off of the service interface. I'd argue that they should go to the 
>>>>>>>> concrete
>>>>>>>> DAO, and only on the methods that actually hit the database. The
>>>>>>>> alternative would be to move them to the ServiceImpl.
>>>>>>>>
>>>>>>>> That said, I'm fine if we want to move them from HibernateVisitDAO
>>>>>>>> up to the VisitService *interface* for consistency, so that we can
>>>>>>>> refactor *all* our services later. But what's the argument for
>>>>>>>> moving it from the HibernateDAO to the ServiceImpl?
>>>>>>>>
>>>>>>>> Ideally Rafal will quickly figure out how to move the recent advice
>>>>>>>> code he wrote so it's triggered by any @Transactional method anywhere, 
>>>>>>>> and
>>>>>>>> this will be moot.
>>>>>>>>
>>>>>>>> -Darius
>>>>>>>>
>>>>>>>>
>>>>>>>> On Thu, Feb 23, 2012 at 5:58 PM, Wyclif Luyima 
>>>>>>>> <[email protected]>wrote:
>>>>>>>>
>>>>>>>>> Hi guys,
>>>>>>>>>
>>>>>>>>> @Daniel, we need to move the @Transanctional annotations from
>>>>>>>>> HibernateVisitDao to ConceptServiceImpl before cutting the 1.9 RC
>>>>>>>>>
>>>>>>>>> Wyclif
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>> ------------------------------
>>>>>>>> Click here to 
>>>>>>>> unsubscribe<[email protected]?body=SIGNOFF%20openmrs-devel-l>from
>>>>>>>>  OpenMRS Developers' mailing list
>>>>>>>
>>>>>>>
>>>>>>> ------------------------------
>>>>>>> Click here to 
>>>>>>> unsubscribe<[email protected]?body=SIGNOFF%20openmrs-devel-l>from
>>>>>>>  OpenMRS Developers' mailing list
>>>>>>>
>>>>>>
>>>>>> ------------------------------
>>>>>> Click here to 
>>>>>> unsubscribe<[email protected]?body=SIGNOFF%20openmrs-devel-l>from
>>>>>>  OpenMRS Developers' mailing list
>>>>>>
>>>>>
>>>>> ------------------------------
>>>>> Click here to 
>>>>> unsubscribe<[email protected]?body=SIGNOFF%20openmrs-devel-l>from
>>>>>  OpenMRS Developers' mailing list
>>>>>
>>>>
>>>> ------------------------------
>>>> Click here to 
>>>> unsubscribe<[email protected]?body=SIGNOFF%20openmrs-devel-l>from
>>>>  OpenMRS Developers' mailing list
>>>>
>>>
>>> ------------------------------
>>> Click here to 
>>> unsubscribe<[email protected]?body=SIGNOFF%20openmrs-devel-l>from 
>>> OpenMRS Developers' mailing list
>>>
>>
>> ------------------------------
>> Click here to 
>> unsubscribe<[email protected]?body=SIGNOFF%20openmrs-devel-l>from 
>> OpenMRS Developers' mailing list
>>
>
> ------------------------------
> Click here to 
> unsubscribe<[email protected]?body=SIGNOFF%20openmrs-devel-l>from 
> OpenMRS Developers' mailing list
>

_________________________________________

To unsubscribe from OpenMRS Developers' mailing list, send an e-mail to 
[email protected] with "SIGNOFF openmrs-devel-l" in the  body (not 
the subject) of your e-mail.

[mailto:[email protected]?body=SIGNOFF%20openmrs-devel-l]

Reply via email to