list v. bag - javadoc, migration guide

This commit is contained in:
Steve Ebersole 2022-01-27 08:49:42 -06:00
parent 32f493e74c
commit 67fbab36bb
5 changed files with 55 additions and 7 deletions

View File

@ -640,7 +640,10 @@ public interface SessionFactoryBuilder {
/** /**
* @see JpaCompliance#isJpaListComplianceEnabled() * @see JpaCompliance#isJpaListComplianceEnabled()
*
* @deprecated Use {@link org.hibernate.cfg.AvailableSettings#DEFAULT_LIST_SEMANTICS} instead
*/ */
@Deprecated( since = "6.0" )
SessionFactoryBuilder enableJpaListCompliance(boolean enabled); SessionFactoryBuilder enableJpaListCompliance(boolean enabled);
/** /**

View File

@ -785,20 +785,19 @@ public interface AvailableSettings {
* list index configuration. * list index configuration.
* <p/> * <p/>
* Historically Hibernate interpreted this using * Historically Hibernate interpreted this using
* {@link org.hibernate.metamodel.CollectionClassification#BAG} semantics. The JPA-compliant * {@linkplain org.hibernate.metamodel.CollectionClassification#BAG BAG} semantics.
* default is to consider it a {@link org.hibernate.metamodel.CollectionClassification#LIST}. * Starting in 6.0, Hibernate now interprets this situation using
* {@linkplain org.hibernate.metamodel.CollectionClassification#LIST LIST} semantics.
* <p/> * <p/>
* Accepts any of: * Accepts any of:
* <ul> * <ul>
* <li>an instance of {@code CollectionClassification}, * <li>an instance of {@code CollectionClassification}
* <li>the (case insensitive) name of a {@code CollectionClassification}, or * <li>the (case insensitive) name of a {@code CollectionClassification} (bag e.g.)
* <li>a {@link Class} representing either {@link java.util.List} or {@link java.util.Collection}. * <li>a {@link Class} representing either {@link java.util.List} or {@link java.util.Collection}
* </ul> * </ul>
* <p/> * <p/>
* Backwards compatibility can be achieved by specifying `hibernate.mapping.default_list_semantics=bag` e.g. * Backwards compatibility can be achieved by specifying `hibernate.mapping.default_list_semantics=bag` e.g.
* *
* @see org.hibernate.jpa.spi.JpaCompliance#isJpaListComplianceEnabled()
*
* @since 6.0 * @since 6.0
*/ */
String DEFAULT_LIST_SEMANTICS = "hibernate.mapping.default_list_semantics"; String DEFAULT_LIST_SEMANTICS = "hibernate.mapping.default_list_semantics";
@ -2147,7 +2146,13 @@ public interface AvailableSettings {
* @see org.hibernate.jpa.spi.JpaCompliance#isJpaListComplianceEnabled() * @see org.hibernate.jpa.spi.JpaCompliance#isJpaListComplianceEnabled()
* *
* @since 5.3 * @since 5.3
*
* @deprecated Use {@link org.hibernate.cfg.AvailableSettings#DEFAULT_LIST_SEMANTICS} instead.
* The specification is actually undefined in terms of how this should be handled. It actually
* says that portable applications should not rely on a specific behavior in terms of a List
* with no `@OrderColumn`
*/ */
@Deprecated( since = "6.0" )
String JPA_LIST_COMPLIANCE = "hibernate.jpa.compliance.list"; String JPA_LIST_COMPLIANCE = "hibernate.jpa.compliance.list";
/** /**

View File

@ -7,6 +7,7 @@
package org.hibernate.jpa.spi; package org.hibernate.jpa.spi;
import org.hibernate.Transaction; import org.hibernate.Transaction;
import org.hibernate.cfg.AvailableSettings;
/** /**
* Encapsulates settings controlling whether Hibernate complies strictly * Encapsulates settings controlling whether Hibernate complies strictly
@ -56,7 +57,10 @@ public interface JpaCompliance {
* interpreting the mapping as a "list", rather than a "bag" * interpreting the mapping as a "list", rather than a "bag"
* *
* @see org.hibernate.cfg.AvailableSettings#JPA_LIST_COMPLIANCE * @see org.hibernate.cfg.AvailableSettings#JPA_LIST_COMPLIANCE
*
* @deprecated Use {@link org.hibernate.cfg.AvailableSettings#DEFAULT_LIST_SEMANTICS} instead
*/ */
@Deprecated( since = "6.0" )
boolean isJpaListComplianceEnabled(); boolean isJpaListComplianceEnabled();
/** /**

View File

@ -80,6 +80,7 @@ public @interface Jpa {
/** /**
* @see JpaCompliance#isJpaListComplianceEnabled() * @see JpaCompliance#isJpaListComplianceEnabled()
* @see org.hibernate.cfg.AvailableSettings#DEFAULT_LIST_SEMANTICS
*/ */
boolean listMappingComplianceEnabled() default false; boolean listMappingComplianceEnabled() default false;

View File

@ -235,6 +235,41 @@ See https://docs.jboss.org/hibernate/orm/6.0/userguide/html_single/Hibernate_Use
for details of using `@CollectionTypeRegistration` for details of using `@CollectionTypeRegistration`
[[collection-list-as-bag]]
==== List as BAG
Historically, Hibernate treated `List` attributes with no explicit ordering details using its
BAG semantics.
```
@ElementCollection
List<String> names;
```
This is not the most natural decision and is rooted in the original annotation
support being too closely related to the `hbm.xml` mapping format.
Starting in 6.0, Hibernate now makes the more natural interpretation of such a mapping using its
LIST semantics. It treats the above example with an implicit an `@OrderColumn`. The above mapping
is now equivalent to
```
@ElementCollection
@OrderColumn(...)
List<String> names;
```
A new "compatibility flag" has been added to allow continuing with the legacy behavior:
```
hibernate.mapping.default_list_semantics=bag
```
The same can be achieved for specific attributes using the new `@Bag` annotation as well.
=== Misc === Misc
* The default type for `Duration` was changed to `NUMERIC` which could lead to schema validation errors * The default type for `Duration` was changed to `NUMERIC` which could lead to schema validation errors