@Test
  public void testLock() {
    Session s1 = HibernateUtil.getSessionFactory().openSession();

    Long id;
    // store a user
    Transaction ta1 = s1.beginTransaction();
    try {
      YUser u = new YUser("test");
      s1.save(u);
      id = u.getId();
    } finally {
      ta1.commit();
    }

    ta1 = s1.beginTransaction();
    try {
      YUser u1 = (YUser) s1.load(YUser.class, id);
      YUser u2 = (YUser) s1.load(YUser.class, id);

      u1.setDescription("YEAH!");
      assertEquals("YEAH!", u2.getDescription());
    } finally {
      ta1.rollback();
    }

    s1.close();
  }
  @Test
  public void testLockDifferentSessions() {
    // emulate two different threads
    Session s1 = HibernateUtil.getSessionFactory().openSession();
    Session s2 = HibernateUtil.getSessionFactory().openSession();

    Long id;
    // store a user
    Transaction ta1 = s1.beginTransaction();
    try {
      YUser u = new YUser("test");
      s1.save(u);
      id = u.getId();
    } finally {
      ta1.commit();
    }

    ta1 = s1.beginTransaction();
    Transaction ta2 = s2.beginTransaction();
    try {
      YUser u1 = (YUser) s1.load(YUser.class, id);
      YUser u2 = (YUser) s2.load(YUser.class, id);

      u1.setDescription("overwrite me");
      u2.setDescription("YEAH!");
    } finally {
      ta1.commit();
      try {
        ta2.commit();
        fail("Shouldn't commit. Two different versions!");
      } catch (StaleObjectStateException ex) {
      }
    }

    s1.close();
    s2.close();
  }