开发者

Hibernate Session is invalidated after ConstraintViolationException

Is there any way to continue using an thread bound hibernate session after constraintviolation exception has been thrown? I'm giving a short example here:

    Parent other=service.load(33); // loads a new parent
    try {
        Parent p=new Parent();
        p.setName("A name");
        service.save(p); // a @Transactional spring service class, throws ConstraintViolationException - name should be at least 15 characters long
    } catch (ConstraintViolationException e){
        // i would like to handle validation errors and proceed normally
        // but the session is allready closed here
    }
    System.out.println("Children: " + other.getChildren开发者_JAVA技巧()); // lazy initialization exception, even when using opensessioninview

From now on the hibernate session is completely useless, even for read-only operations like rendering a lazy collection in view using OpenSessionInView pattern.


Session's documentation states that If the Session throws an exception, the transaction must be rolled back and the session discarded. The internal state of the Session might not be consistent with the database after the exception occurs..

AFAIK, there's no way to recover from this, I recall someone at work warning me not to use the session-per-request/OpenSessionInView-pattern because of these kinds of problems.


Use a StatelessSession instead of a Session. That is the trick.

With a StatelessSession you can continue after any exceptions as it is possible in SQL (even inside one transaction - no commit/rollback is done by hibernate). That is ideal for bulk updates/inserts or for checking if unique constraints are violated.

But beware, a StatelessSession has many Restrictions compared with a normal session. Please refer to the Hibernate documentaion / Javadocs for that.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜