I agree with that to an extent. However there is also a balance - clearly any added complexity has a direct correlation to likelihood of errors/bugs. We just have to find that balance :)
On Mon, Apr 25, 2016 at 9:52 AM Sanne Grinovero <sa...@hibernate.org> wrote: > N.B. that chancing the exception types thrown by our native methods is > an API change in my opinion. > > So while I think you can have some Hibernate exceptions now extend > some of the types expected by JPA, a fully "clean room" approach is > not something I'd do in a minor release. > > On 25 April 2016 at 15:25, Steve Ebersole <st...@hibernate.org> wrote: > > I agree with Gunnar in that the underlying question here is in how we see > > the "Hibernate API" long term. However I would consider the following > > categories: > > > > Methods which are Hibernate-only > > Methods which Hibernate had historically which share a signature with JPA > > Methods which we added to Hibernate specifically for JPA. > > > > > > Personally, in retrospect, I would say that group (3) unequivocally > should > > have been handled by just throwing the JPA exceptions. In a clean-room > impl > > that's what I would do. > > > > So I guess the question is whether we want to look at this as a > clean-room > > impl or if we want to constrain ourselves to the legacy exception > types. I > > do wonder if a hybrid approach may be the best, as touched on before. > > Namely, where JPA expects an IllegalArgumentException, > > IllegalStateException, etc we throw those; for the rest we'd have > Hibernate > > exception extend PersistenceException. I think that's a great > compromise. > > > > I'd also mention that in the IllegalArgumentException, > > IllegalStateException, etc cases there are a few places where > > HibernateExceptions cover the JPA case already. E.g. JPA says that if > there > > is a problem with the JPQL query (String) used to create a Query an > > IllegalArgumentException should be thrown; Hibernate currently handles > this > > by throwing a QuerySyntaxException - we could just make > QuerySyntaxException > > extend from IllegalArgumentException rather than Hibernate's > > HibernateException hierarchy. > > > > I think the bottom line is that having Session and EntityManager split > > before caused all kinds of difficult-to-debug complexity that I'd rather > > avoid as we consolidate them together. > > > > > > On Mon, Apr 25, 2016 at 5:37 AM Sanne Grinovero <sa...@hibernate.org> > wrote: > >> > >> Gunnar's words seem wise to me: users will need to have the JPA API on > >> classpath anyway, so I don't see why we should have - and maintain - > >> strategies for different kind of exceptions. > >> > >> This might have been useful in the past, but looking forward? > >> > >> If the reasoning is that Hibernate - having more features - could > >> throw more specific and informative exceptions, we could have some > >> Hibernate exceptions to subclass the JPA ones? > >> > >> Would be nice to avoid breaking the expected exception types in a > >> minor, so I'm not sure if you can do that in all cases by subclassing > >> the JPA ones, but I suspect it can get you a long way. > >> > >> > >> On 25 April 2016 at 10:13, Gunnar Morling <gun...@hibernate.org> wrote: > >> > The strategy approach sounds nice on first thought, but it also adds > >> > complexity. > >> > > >> > I think the underlying question is: What's the long-term strategy > around > >> > the "Classic API"? Should it remain in place for all times as a > complete > >> > alternative to the JPA API? > >> > > >> > Or should we begin to deprecate it and narrow it down in favour of the > >> > corresponding functionality standardized in JPA, and only > functionality > >> > not > >> > present in JPA would be exposed through some kind of unwrap()? > >> > > >> > Without having thought about all the implications too much, I'd lean > >> > towards the latter, in which case I vote for "1. Just move to JPA > >> > expected > >> > exceptions" as part of such larger effort. > >> > > >> > It'd be interesting to run a poll to see some figures of people using > >> > classic vs. JPA. > >> > > >> > --Gunnar > >> > > >> > > >> > > >> > 2016-04-25 10:47 GMT+02:00 andrea boriero <and...@hibernate.org>: > >> > > >> >> 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.v...@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 < > st...@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 > >> >> > > <st...@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@lists.jboss.org > >> >> > > https://lists.jboss.org/mailman/listinfo/hibernate-dev > >> >> > > > >> >> > _______________________________________________ > >> >> > hibernate-dev mailing list > >> >> > hibernate-dev@lists.jboss.org > >> >> > https://lists.jboss.org/mailman/listinfo/hibernate-dev > >> >> > > >> >> _______________________________________________ > >> >> hibernate-dev mailing list > >> >> hibernate-dev@lists.jboss.org > >> >> https://lists.jboss.org/mailman/listinfo/hibernate-dev > >> >> > >> > _______________________________________________ > >> > hibernate-dev mailing list > >> > hibernate-dev@lists.jboss.org > >> > https://lists.jboss.org/mailman/listinfo/hibernate-dev > >> _______________________________________________ > >> hibernate-dev mailing list > >> hibernate-dev@lists.jboss.org > >> https://lists.jboss.org/mailman/listinfo/hibernate-dev > _______________________________________________ hibernate-dev mailing list hibernate-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/hibernate-dev