[hibernate-dev] Various expectation changes in hibernate-core after consolidating hibernate-entitymanager
andrea boriero
andrea at hibernate.org
Mon Apr 25 04:47:38 EDT 2016
Having a Strategy gives us more flexibility so +1.
About the expectations I think what Vlad says is reasonable.
On 25 April 2016 at 06:04, Vlad Mihalcea <mihalcea.vlad at gmail.com> wrote:
> Your second email summarizes my thoughts as well. If we can separate the
> exception handling in two separate strategies that are defined during
> bootstrap (JPA vs Hibernate),
> I think that's the way to go.
>
> There so many projects out there that rely on the exception type being
> thrown, and changing those would make it very difficult for them to migrate
> to this new version.
> But that only affects Hibernate-native projects since, for those who have
> been using JPA, they already expect the JPA exceptions anyway.
>
> As for the other behavior discrepancies:
>
> 1. "calling EntityManager#close on a closed EntityManager should result in
> an
> exception;" - that's a reasonable default and shouldn't cause too much
> trouble.
> 2. "Another change in expectation is in regards to operations outside of a
> transaction" - in JPA we can execute queries outside a transaction, but any
> write will fail if there is no transactional context, which is reasonable
> for me too. If Hibernate allows writes outside of a transactional context,
> that's definitely a thing we should not support anyway.
> 3. "Asking a Session if is contains (Session/EntityManager#contains) a
> non-entity" - we can handle this with the separate exception handler
> strategies to retain both JPA and Hibernate behaviors.
> 4. "Accessing Session/EntityManager#getTransaction. JPA says that is
> only allowed
> for JDBC transactions. Hibernate always allows it." - I'd choose the
> Hibernate behavior because I don;t see how it can cause any issue and it's
> an enhancement as well.
>
> Vlad
>
>
>
>
>
> On Sat, Apr 23, 2016 at 5:29 PM, Steve Ebersole <steve at hibernate.org>
> wrote:
>
> > Just realized that I should have mentioned an important plan that helps
> > understand the idea behind the "exception handling strategy" route. I
> plan
> > to keep track of how a SessionFactory was bootstrapped in some fashion.
> So
> > when it was bootstrapped from EntityManagerFactoryBuilder (which JPA
> > bootstrap methods leverage) we'd select the "JPA exception handling"
> > strategy impl. When not, we'd use the "legacy Hibernate exception
> > handling" strategy.
> >
> > On Sat, Apr 23, 2016 at 9:21 AM Steve Ebersole <steve at hibernate.org>
> > wrote:
> >
> > > There are a number of "expectation changes" that come about from
> > > consolidating hibernate-entitymanger into hibernate-core. Some we have
> > > discussed; some we have not. Hopefully we can come to a consensus
> > regards
> > > how to deal with these changes...
> > >
> > > The first one is different exception types. We have discussed this
> > > before. For now, in an effort to fix test failures and move forward
> with
> > > developing, I simply changed failing tests to expect the JPA defined
> > > exceptions. I had mentioned, where possible, to to throw a combination
> > of
> > > the 2 expected exceptions. Generally this falls into 2 discrete
> > categories:
> > >
> > >
> > > 1. JPA expects a PersistenceException and we have historically
> thrown
> > > a HibernateException
> > > 2. JPA expects some form of JDK RuntimeException
> > > (IllegalArgumentException, IllegalStateException, etc) and we have
> > > historically thrown a HibernateException
> > >
> > > It is unfortunate that Java does not allow exceptions to be defined by
> > > means of interfaces; that's the only "clean" way I see to do this -
> that
> > > would have allowed us to define concrete exception classes that extend
> > > PersistenceException, IllegalArgumentException, etc and that implement
> > HibernateException.
> > >
> > >
> > > So I see 3 potential solutions (feel free to bring up others).
> > >
> > > 1. Just move to JPA expected exceptions.
> > > 2. Have HibernateException extend PersistenceException and just not
> > > worry about the change in expectation in regards to that second
> > category.
> > > 3. Push exception handling behind a strategy. This would have to
> be a
> > > pretty specific strategy for very specific cases.
> > >
> > > The first and second options are pretty self-explanatory and
> > > straight-forward so I won't go into detail there. Just realize that
> > these
> > > change the expectation for the user. They'd have to change their code
> to
> > > catch these JPA-defined exceptions.
> > > The other option, I see, is to h
> > >
> > > The third option is perfect in theory, but it is very tedious. For
> > > example, take the case of trying to perform some operation on a closed
> > > Session/EntityManager. Hibernate historically threw a
> HibernateException
> > > here. JPA says that should result in an IllegalStateException. So in
> > > SessionImpl#checkOpen, when the Session/EntityManager is closed, we'd
> > > call out to the strategy to handle that condition. Even more,
> Hibernate
> > > (historically) and JPA disagree about which methods getting called on a
> > > closed Session/EntityManager should lead to an exception. For example,
> > > JPA says calling EntityManager#close on a closed EntityManager should
> > > result in an exception; Hibernate historically did not care if you
> called
> > > Session#close on a closed Session. So that is a special case, and
> every
> > > one of those special cases would have to be exposed and handled in the
> > > exception handling strategy in additional to the general cases.
> > >
> > > Another change in expectation is in regards to operations outside of a
> > > transaction, which I consider a questionable pattern anyway. Hibernate
> > > historically allowed that; JPA explicitly disallows it. In a way this
> > > could fall under the exception discussion above, meaning we could push
> > that
> > > distinction behind the exception handling strategy. Or we could decide
> > > that we are going to stop supporting that.
> > >
> > > There are a lot of other highly questionable things I have seen in the
> > > tests that JPA explicitly disallows that I think we ought to just stop
> > > supporting and opt for the JPA way, although I am open to discussing
> them
> > > if any feels strongly about them. Some of these include:
> > >
> > > - Asking a Session if is contains (Session/EntityManager#contains) a
> > > non-entity. Hibernate historically would just return false. JPA
> > states
> > > that should be an exception.
> > > - Accessing Session/EntityManager#getTransaction. JPA says that is
> > > only allowed for JDBC transactions. Hibernate always allows it.
> > >
> > > If we go the route of an "exception handling strategy" a lot of the
> other
> > > points I mentioned above could just be pushed behind that strategy.
> But
> > I
> > > really want to start looking critically at what we support today that
> we
> > > maybe really should not be.
> > >
> > _______________________________________________
> > hibernate-dev mailing list
> > hibernate-dev at lists.jboss.org
> > https://lists.jboss.org/mailman/listinfo/hibernate-dev
> >
> _______________________________________________
> hibernate-dev mailing list
> hibernate-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/hibernate-dev
>
More information about the hibernate-dev
mailing list