I have service methods annotated with @Transactional. When the validation fails, and I already have an entity attached to the current unit of work, I use sessionFactory.getCurrentSession().evict(entity) to make sure nothing is written to the database. That way I don't need to throw an exception.