Ah, another option: I can annotate the Resource method with @UnitOfWork(transactional=false), and then manage just the transaction part myself.
On Sun, Aug 23, 2020 at 8:05 PM Aditya Prasad <[email protected]> wrote: > And now I remember: I already tried option (3). > > If I try to create a transaction while there's a @UnitOfWork annotation, I > get java.lang.IllegalStateException: Transaction already active. If I try > without that annotation, it fails (expectedly) > with org.hibernate.HibernateException: No session currently bound to > execution context. > > Thanks to your response on the other thread, I realized I have to do this: > > try (Session session = fooDao.factory.openSession()) { > ManagedSessionContext.bind(session); > Transaction transaction = session.beginTransaction(); > fooDao.doStuff(); > transaction.commit(); > ManagedSessionContext.unbind(serviceDao.factory); > } catch (Exception e) { > ... error handling > } > > Which is pretty terrible. I might create my own annotation to create and > bind/unbind the session (to use on Resource methods), and then create the > transactions myself in the Service methods. > > On Sun, Aug 23, 2020 at 7:45 PM Aditya Prasad <[email protected]> wrote: > >> Excellent, thanks. (1) isn't great for me, because there isn't enough >> information in the exception to return what I want. (2) doesn't quite work >> either: my Resource methods are responsible for mapping db objects to my >> API objects. It would help if the session is still active there, so that >> any lazy fields can still be fetched. >> >> The other major problem I see with @UnitOfWork on Resource methods is >> that, because the exceptions are thrown *outside* my code, none of my >> code shows up in the stack trace, making debugging much harder. >> >> On Sun, Aug 23, 2020 at 9:41 AM Dimas Guardado <[email protected]> >> wrote: >> >>> Hi Aditya, >>> >>> I can see a few options here: >>> >>> 1) Register an ExceptionMapper to customize the response for exceptions >>> of a given type: >>> https://www.dropwizard.io/en/latest/manual/core.html#error-handling >>> 2) Add `@UnitOfWork` to a method in an object below the resource layer >>> (eg in a Service object) and catch exceptions in the resource method that >>> calls it. To do this, you'll need to create your service object using a >>> `UnitOfWorkAwareProxyFactory` >>> https://www.dropwizard.io/en/latest/manual/hibernate.html#transactional-resource-methods-outside-jersey-resources >>> 3) Manually manage the transaction. I think if you use >>> `getCurrentSession()` instead of creating your own session, it should work >>> as you expect. I'd definitely recommend one of the approaches above over >>> managing transactions yourself, though. >>> >>> Do any of these work for you? >>> >>> On Friday, August 21, 2020 at 3:01:17 PM UTC-7 Aditya Prasad wrote: >>> >>>> Hi, >>>> >>>> It seems that @UnitOfWork can only be applied to resource methods. This >>>> means that if the transaction fails, there's nowhere for me to catch >>>> whatever exception is thrown (because it's DW that's invoking my method). >>>> This gives me no control over what I return to users. >>>> >>>> What's the proper way to fix this? One thing I've tried is creating the >>>> session and transaction explicitly: >>>> >>>> try (Session session = fooDao.factory.openSession()) { >>>> Transaction transaction = session.beginTransaction(); >>>> fooDao.doStuff(); >>>> transaction.commit(); >>>> } catch (Exception e) { >>>> ... error handling >>>> } >>>> >>>> But then in fooDao I get org.hibernate.HibernateException: No session >>>> currently bound to execution context. This probably relates to the last >>>> question I asked in the group, where `session` is valid but >>>> `sessionFactory.getCurrentSession` does not return it for some reason. What >>>> am I missing? >>>> >>>> Thanks, >>>> A >>>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "dropwizard-user" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> To view this discussion on the web visit >>> https://groups.google.com/d/msgid/dropwizard-user/4a254110-884f-4e42-9cf9-793efb728ec3n%40googlegroups.com >>> <https://groups.google.com/d/msgid/dropwizard-user/4a254110-884f-4e42-9cf9-793efb728ec3n%40googlegroups.com?utm_medium=email&utm_source=footer> >>> . >>> >> -- You received this message because you are subscribed to the Google Groups "dropwizard-user" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/dropwizard-user/CAMx7i46Q6Pfi1vhghAPaByeJOSL9LJpyqGOwUMqd%3Dk1SVQQeiA%40mail.gmail.com.
