You need to call session.flush after you save, this will send your
data to the database and trigger any constraint exceptions.
http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html#flush()

I'm pretty sure that the tapestry-hibernate thread/request management
is done within the context of a request and you will need to plumb
that yourself, perhaps in @Before and @After methods. I can't look it
up now, but if I think about it later I'll track it down.

I wouldn't recommend this approach though. In your tests you should
want to have more control over what is happening with your objects.
For instance, letting tapestry-hibernate take care of the flush/commit
of the session/transaction means that you can't write tests like your
second one because it wouldn't throw an exception until
tapestry-hibernate cleanup happend after the method has exited.

Josh

On Tue, Mar 18, 2008 at 10:54 AM, Julian Wood <[EMAIL PROTECTED]> wrote:
> I have a UserService:
>
> public class UserServiceImpl implements UserService {
>     private Session session;
>
>     public UserServiceImpl(@InjectService("Session")Session session) {
>         this.session = session;
>     }
>
>     public void save(User user) {
>         session.save(user);
>     }
> }
>
> I bind this in the AppModule, and then I can use it in any page or
> component class. This is great.
>
> Now for unit testing my UserService, I make my own RegistryBuilder as
> others have recommended, and can do a test:
>
>     @BeforeClass
>     protected void setup() {
>         RegistryBuilder builder = new RegistryBuilder();
>
>         builder.add(HibernateModule.class);
>         builder.add(SetupForTest.class);
>         builder.add(AppModule.class);
>
>         Registry registry = builder.build();
>
>         registry.performRegistryStartup();
>
>         userService = registry.getService("userService",
> UserService.class);
>
>     }
>
>     @Test
>     public void testAddUsers() throws Exception {
>
>         User user = createRandomUser();
>         userService.save(user);
>
>         List<User> users = userService.getUsers();
>         assertEquals(1, users.size());
>     }
>
> Now, the first problem is that this will not be committed to the
> database, when you have hibernate configured with autocommit=false. To
> accomplish that, I need to grab the session out of the registry and
> add this:
>
>     @AfterClass
>     protected void closeSession() throws Exception {
>         session.getTransaction().commit();
>         session.close();
>     }
>
> I would have thought that Tapestry-hibernate would take care of that
> (it does when run as a webapp, so no real problem here), given it is
> supposed to commit or rollback when the thread ends (in this case the
> thread is running all the tests).
>
> My real question comes when I want to test some of the constraints on
> my database. For instance, there is a unique constraint on the
> username in the User class. So a test might be:
>
>     @Test
>     public void testAddUsersWithSameUsernames() throws Exception {
>
>         User user = createRandomUser("woodj");
>         userService.save(user);
>
>         User duplicateUser = createRandomUser("woodj");
>         try {
>             userService.save(duplicateUser);
>
>             Assert.fail("Should have thrown exception with duplicate
> username constraint exception.");
>         } catch (HibernateException e) {
>             //success
>         }
>    }
>
> Now when this test is run I get a failure (don't flush the Session
> after an exception occurs), because of my closeSession method. I can
> remove the closeSession, which shouldn't really be there anyway, and
> everything passes, but I don't get the additional comfort of checking
> my db to make sure hibernate synched things up properly.
>
> I can rollback manually in the exception, by getting the current txn
> from the session service, but I get the same failure. It seems that no
> matter what you do, once an exception is thrown, and regardless of how
> you handle it, that session is done.
>
> I've also tried all the aforementioned, but using the
> HibernateSessionManager service to grab the session, which should
> allow me to commit and abort midsession, but it suffers the exact same
> failures, despite it's assurance in the javadoc:
>
> Manages the Hibernate session for the current thread. This includes
> creating the session as
> needed, allowing the session to checkpoint (commit the current
> transaction and continue) and
> commit the transaction automatically at the end of the request.
>
> So my question is: can I test my services, under the
> HibernateSessionManager, and have the flexibility to commit and
> rollback midsession? It seems not, but maybe I missed something.
>
> And just BTW, if I create my own SessionFactory and handle the session
> and txn's myself, everything works as expected.
>
> Thanks for any thoughts.
>
> J
>
>
> On Feb 4, 2008, at 8:01 AM, Davor Hrg wrote:
>
> > HibernateSessionManager handles session for a request,
> > and does commit at the end.
> >
> > if you want to have more than one commit you should not call it
> > directly on the injected session since it will confuse
> > HibernateSessionManager.
> > Same goes for rollback.
> >
> > Davor Hrg
> >
> >
> > On Feb 4, 2008 3:52 PM, Angelo Chen <[EMAIL PROTECTED]>
> > wrote:
> >>
> >> hi,
> >>
> >> I have used Session session in my app and it works, I have seen
> >> HibernateSessionManager being mentioned many times in the list,
> >> what are the
> >> advantages of using HibernateSessionManager compared app which does
> >> not
> >> explicitly use it?
> >>
> >> Thanks,
> >>
> >> Angelo
> >> --
> >> View this message in context: 
> >> http://www.nabble.com/T5%3A-HibernateSessionManager-tp15268872p15268872.html
> >> Sent from the Tapestry - User mailing list archive at Nabble.com.
> >>
> >>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: [EMAIL PROTECTED]
> >> For additional commands, e-mail: [EMAIL PROTECTED]
> >>
> >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> >
> >
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>



-- 
--
TheDailyTube.com. Sign up and get the best new videos on the internet
delivered fresh to your inbox.

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to