It is not about the order but about duplicates. With the following class A { List<b> bsl @JoinTable(name = "A_B", joinColumns = @JoinColumn(name = "A_ID"), inverseJoinColumns = @JoinColumn(name = "B_ID"), ) @ManyToMany public List<B> getBs() { return b; } }
class *B*{ List<A> as; .... @ManyToMany(mappedBy = "bs", cascade=CascadeType.ALL) public List<A> getAs() { return as; } } and it seems JPA expects the JoinTable A_B to have a PK (A_ID,B_ID). On 28 November 2017 at 05:44, Vlad Mihalcea <mihalcea.v...@gmail.com> wrote: > I don't understand what is the requirement for the @Bag annotation and the > `hibernate.jpa.compliance=list` setting. > > From the JPA spec, only if we provide @OredrBy or @OrderColumn we get an > ordered List. > Otherwise, the order is undefined. > Is there anything I'm missing about handling Lists according to the JPA > spec? > > Vlad > > On Mon, Nov 27, 2017 at 11:29 PM, Steve Ebersole <st...@hibernate.org> > wrote: > >> So then how about the following: >> >> >> 1. Add a multi-valued setting to define various categories of JPA >> compliance. E.g. `hibernate.jpa.compliance` with multi-selectable values >> such as: >> 1. query (strict jpql compliance) >> 2. txn (transaction handling per spec) >> 3. close (multiple calls to EMF and EM #close methods) >> 4. list (no bags) >> 5. others? >> 6. all (there should be some form of specifying all) >> 2. Add @Bag as an explicit declaration of a bag, even if >> `hibernate.jpa.compliance=list` is specified - that setting just >> controls how List with no @OrderColumn is interpreted. I vote to delay >> adding that until 6.0 >> 3. Retain current behavior for "double close" calls unless "close" >> compliance has been specified. >> 4. Keep current behavior unless "txn" compliance has been specified >> >> >> >> On Mon, Nov 27, 2017 at 4:54 AM andrea boriero <and...@hibernate.org> >> wrote: >> >>> On 24 November 2017 at 17:39, Steve Ebersole <st...@hibernate.org> >>> wrote: >>> >>>> Andrea, SF is a EMF. Unwrapping simply returns the same instance. >>>> >>> >>> yes but has you pointed out due to the bootstrapping the behaviour of >>> the SF will be strict JPA compliant. >>> >>>> >>>> Another thing I was discussing with Andrea in chat is possibly making >>>> these multi-valued, or having multiple values for this. I can't imagine >>>> the FQN case is really all that appealing to a user. I'm fairly certain a >>>> user would rather simply say "yeah, treat transactions according the JPA >>>> spec" as opposed to "here is a class I will provide that will tell will >>>> treat transactions according to the JPA spec". >>>> >>>> We have started to identify some cases where we deviate from the >>>> spec[1], such as: >>>> * Strict query compliance. As I mentioned earlier we do have such a >>>> setting already for this in particular >>>> * List versus Bag determination from mappings. >>>> * Closed EMF (SF) handling >>>> * EntityTransaction status checking - JPA says we should throw >>>> exceptions whereas we just ignore the call. >>>> >>>> We need to decide also which of these we want to just change outright >>>> versus controlling via a setting. >>>> >>>> * Setting >>>> * Setting, or introduce a new @Bag annotation - the annotation option >>>> is actually pretty appealing since often times the bag behavior is so >>>> unexpected from users... >>>> >>> >>> @Bag seems really a good idea to me but that means changing the current >>> default behaviour, forcing users to change the code, so not sure if we need >>> also a setting. >>> >>> >>>> * I think we should just change the behavior of calling EMF#close on a >>>> closed EMF. Any application that happens to be relying on us no-op'ing >>>> this call can easily change that to protect the call with an `#isOpen` >>>> check. In fact I think we should change all of these to match the JPA >>>> expectations such that it is an error to call any of the following: #close, >>>> #getCache, #getMetamodel, #getCriteriaBuilder, #getProperties, >>>> #getPersistenceUnitUtil, #createEntityManager. To me these all seem pretty >>>> reasonable. And in fact I think we used to handle this all properly from >>>> the EMF side. I think we just lost that behavior when we changed to have >>>> our contracts extend the JPA ones since we kept the legacy Hibernate >>>> behavior in SessionFactory. >>>> >>> >>> I do not like the EMF#close behaviour, probably a prefer a separate >>> setting for this. >>> >>> >>>> * This one I am very undecided. I can see very valid arguments for >>>> each. >>>> >>> >>> probably for such case a setting may be a good option. >>> >>>> >>>> [1] we really ought to start keeping a list of these. I have started >>>> adding them to the migration guide. Just as a list of things we need to >>>> support configuring or switch to the JPA "way". >>>> >>>> On Fri, Nov 17, 2017 at 11:06 AM andrea boriero <and...@hibernate.org> >>>> wrote: >>>> >>>>> I think for 5.3 it's still fine to rely on isJpaBootstrap may be >>>>> documenting that a SF obtained from unwrapping an EMF will conform to the >>>>> JPA spec in term of exceptions. >>>>> >>>>> On 16 November 2017 at 21:09, Vlad Mihalcea <mihalcea.v...@gmail.com> >>>>> wrote: >>>>> >>>>>> When I said multiple modes, I was thinking of defining all these >>>>>> situations >>>>>> In some interface which declares methods like: >>>>>> >>>>>> boolean throwsExceptionWhenClosingAClosedEMF() >>>>>> >>>>>> The interface can have two implementations for Strict JPA and Native >>>>>> mode. >>>>>> >>>>>> However, the setting could take the FQN of the interface >>>>>> implementation, so >>>>>> a user can define those compatibility methods according to their >>>>>> needs. >>>>>> >>>>>> E.g. Maybe someone wants the Strict JPA mode but with just 2 >>>>>> differences; >>>>>> >>>>>> - don't throw exception when closing the ENG twice >>>>>> - use the native Hibernate FlushMode.AUTO instead of the JPA one. >>>>>> >>>>>> Vlad >>>>>> >>>>>> On 16 Nov 2017 10:49 pm, "Steve Ebersole" <st...@hibernate.org> >>>>>> wrote: >>>>>> >>>>>> > There is already a similar setting, although specific to query >>>>>> language: >>>>>> > `hibernate.query.jpaql_strict_compliance` - so there is precedence >>>>>> for >>>>>> > such a solution. >>>>>> > >>>>>> > I'm not sure about the "with multiple modes" aspect though. What >>>>>> are >>>>>> > these other enumerated mode values? >>>>>> > >>>>>> > >>>>>> > On Thu, Nov 16, 2017 at 2:15 PM Vlad Mihalcea < >>>>>> mihalcea.v...@gmail.com> >>>>>> > wrote: >>>>>> > >>>>>> >> Where the JPA way is questionable, let's add one configuration: >>>>>> >> hibernate.jpa.compliance with multiple modes: >>>>>> >> >>>>>> >> - strict: we do whatever the JPA standard says we should do, like >>>>>> >> throwing an exception when trying to close the EMF twice >>>>>> >> - native: we bend the rule where we don't agree with the standard >>>>>> >> >>>>>> >> Maybe we should expose all those cases and group them in some >>>>>> interface >>>>>> >> to allow the user to customize the level of compliance they need. >>>>>> >> >>>>>> >> Vlad >>>>>> >> >>>>>> >> On Thu, Nov 16, 2017 at 10:06 PM, Steve Ebersole < >>>>>> st...@hibernate.org> >>>>>> >> wrote: >>>>>> >> >>>>>> >>> It was added deprecated. Meaning I added it knowing it would go >>>>>> away >>>>>> >>> and I wanted to avoid users using it. >>>>>> >>> >>>>>> >>> BTW, I am talking about a 5.3 release specifically covering 5.2 + >>>>>> JPA >>>>>> >>> 2.2. Yes there is a longer term aspect as well with 6.0 and >>>>>> beyond. >>>>>> >>> >>>>>> >>> Its specifically the "where the JPA way is questionable" aspect I >>>>>> am >>>>>> >>> asking about. Like to me, it really never makes sense to throw an >>>>>> >>> exception when I close something that is already closed. So how >>>>>> do we >>>>>> >>> handle cases like this? >>>>>> >>> >>>>>> >>> >>>>>> >>> On Thu, Nov 16, 2017 at 1:51 PM Vlad Mihalcea < >>>>>> mihalcea.v...@gmail.com> >>>>>> >>> wrote: >>>>>> >>> >>>>>> >>>> Hi Steve, >>>>>> >>>> >>>>>> >>>> I think that for 5.2 was ok to have the isJpaBootstrap method to >>>>>> avoid >>>>>> >>>> breaking compatibility for the native bootstrap. >>>>>> >>>> For 6.0, maybe it's easier if we just align to the JPA spec >>>>>> where it >>>>>> >>>> makes sense, >>>>>> >>>> and only provide a separation where the JPA way is questionable. >>>>>> >>>> >>>>>> >>>> I noticed that the isJpaBootstrap method is deprecated. Was it >>>>>> >>>> intended to be removed in 6.0? >>>>>> >>>> >>>>>> >>>> Vlad >>>>>> >>>> >>>>>> >>>> On Thu, Nov 16, 2017 at 6:21 PM, Steve Ebersole < >>>>>> st...@hibernate.org> >>>>>> >>>> wrote: >>>>>> >>>> >>>>>> >>>>> Part of 5.2 was merging the JPA contracts into the corresponding >>>>>> >>>>> Hibernate >>>>>> >>>>> ones. So, e.g., we no longer "wrap" a SessionFactory in an >>>>>> impl of >>>>>> >>>>> EntityManagerFactory - instead, SessionFactory now extends >>>>>> >>>>> EntityManagerFactory. >>>>>> >>>>> >>>>>> >>>>> This caused a few problems that we handled as they came up. In >>>>>> >>>>> working on >>>>>> >>>>> the JPA 2.2 compatibility testing, I see that there are a few >>>>>> more >>>>>> >>>>> still >>>>>> >>>>> that we need to resolve. Mostly they relate to JPA expecting >>>>>> >>>>> exceptions in >>>>>> >>>>> certain cases where Hibernate has historically been lenient. >>>>>> E.g., JPA >>>>>> >>>>> says that calling EntityManagerFactory#close on an EMF that is >>>>>> already >>>>>> >>>>> closed should result in an exception. Historically, calling >>>>>> >>>>> SessionFactory#close on a SF that is already closed is simply >>>>>> ignored. >>>>>> >>>>> Philosophical debates aside[1], we need to decide how we want >>>>>> to handle >>>>>> >>>>> this situation such that we can throw the JPA-expected >>>>>> exceptions when >>>>>> >>>>> needed. Do we simply change SF#close to match the JPA >>>>>> expectation? >>>>>> >>>>> Or do >>>>>> >>>>> we somehow >>>>>> >>>>> make SF#close aware of JPA versus "native" use? This latter >>>>>> option >>>>>> >>>>> was the >>>>>> >>>>> intent of `SessionFactoryOptions#isJpaBootstrap` and we can >>>>>> certainly >>>>>> >>>>> continue to use that as the basis of the solution here for >>>>>> other cases. >>>>>> >>>>> >>>>>> >>>>> This `#isJpaBootstrap` flag is controlled by the JPA bootstrap >>>>>> code. >>>>>> >>>>> So if >>>>>> >>>>> the EMF is created in either of the 2 JPA-defined bootstrap >>>>>> mechanisms, >>>>>> >>>>> that flag is set to true. It's an ok solution, but it does >>>>>> have some >>>>>> >>>>> limitations - mainly, there was previously a distinction between >>>>>> >>>>> SF#close >>>>>> >>>>> being called versus EMF#close being called (they were different >>>>>> >>>>> classes, so >>>>>> >>>>> they could react differently). Therefore, regardless of >>>>>> bootstrap >>>>>> >>>>> mechanism, if the user unwrapped the EMF to a SF, they would >>>>>> always >>>>>> >>>>> get the >>>>>> >>>>> legacy SF behavior. >>>>>> >>>>> >>>>>> >>>>> So long story short, so we want to consider an alternative >>>>>> approach to >>>>>> >>>>> deciding what to do in "some"[2] of these cases? Again, we >>>>>> clearly >>>>>> >>>>> need >>>>>> >>>>> these to throw the spec-mandated exceptions in certain "strict >>>>>> >>>>> compliance" >>>>>> >>>>> situations. The question really is how to do that. Should we: >>>>>> >>>>> >>>>>> >>>>> 1. just completely change the behavior to align with the >>>>>> spec? >>>>>> >>>>> 2. change the behavior to match the spec *conditionally*, >>>>>> where that >>>>>> >>>>> condition could be: >>>>>> >>>>> 1. `#isJpaBootstrap` >>>>>> >>>>> 2. some setting >>>>>> >>>>> 3. some extension contract >>>>>> >>>>> 4. something else? >>>>>> >>>> >>>>>> >>>> >>>>>> >>>>> >>>>>> >>>>> Thoughts? >>>>>> >>>>> >>>>>> >>>>> >>>>>> >>>>> [1] It's not relevant e.g. that I think JPA is wrong here. We >>>>>> need to >>>>>> >>>>> comply with the spec, at least in certain cases ;) >>>>>> >>>>> >>>>>> >>>>> [2] I say "some" here, because I think the spec is correct in >>>>>> some >>>>>> >>>>> cases - >>>>>> >>>>> for example, I think its clearly correct that a closed EMF >>>>>> throws an >>>>>> >>>>> exception when `#createEntityManager` is called. Personally I >>>>>> think >>>>>> >>>>> its >>>>>> >>>>> questionable whether closing an already closed EMF should be an >>>>>> >>>>> exception. >>>>>> >>>>> >>>>>> >>>> _______________________________________________ >>>>>> >>>>> 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