Switch back to bag by default for list semantics
This commit is contained in:
parent
4f7d4b7fdb
commit
7aaeebe3af
|
@ -84,22 +84,18 @@ include::{classificationTestsDir}/list/EntityWithList.java[tags=collections-list
|
||||||
----
|
----
|
||||||
====
|
====
|
||||||
|
|
||||||
The ordering of a list is maintained as a column in the database to hold the element's index.
|
Contrary to natural expectations, the ordering of a list is by default not maintained.
|
||||||
This column can be configured via the `jakarta.persistence.OrderColumn` annotation.
|
To maintain the order, it is necessary to explicitly use the `jakarta.persistence.OrderColumn` annotation.
|
||||||
|
|
||||||
[[NOTE]]
|
[[NOTE]]
|
||||||
====
|
====
|
||||||
Historically, Hibernate interpreted a `List` attribute without `@OrderColumn` as a BAG.
|
Starting in 6.0, Hibernate allows to configure the default semantics of `List` without `@OrderColumn`
|
||||||
|
via the `hibernate.mapping.default_list_semantics` setting.
|
||||||
|
To switch to the more natural LIST semantics with an implicit order-column, set the setting to `LIST`.
|
||||||
|
|
||||||
Starting in 6.0, however, Hibernate has moved to the more natural choice to map such
|
The default column name that stores the index is derived from the attribute name, by suffixing `_ORDER`.
|
||||||
Lists using LIST semantics with an implicit order-column. For applications needing backwards
|
|
||||||
compatibility, Hibernate has added the `hibernate.mapping.default_list_semantics` setting. To
|
|
||||||
achieve the legacy behavior, set `hibernate.mapping.default_list_semantics=bag`
|
|
||||||
====
|
====
|
||||||
|
|
||||||
The mapping above would store the index in a column named `names_ORDER`, per the default
|
|
||||||
for `jakarta.persistence.OrderColumn#name`. We can also explicitly name the column to use; e.g.
|
|
||||||
|
|
||||||
[[collection-list-ordercolumn-ex]]
|
[[collection-list-ordercolumn-ex]]
|
||||||
.@OrderColumn
|
.@OrderColumn
|
||||||
====
|
====
|
||||||
|
|
|
@ -478,7 +478,7 @@ public class MetadataBuilderImpl implements MetadataBuilderImplementor, TypeCont
|
||||||
}
|
}
|
||||||
return classification;
|
return classification;
|
||||||
},
|
},
|
||||||
CollectionClassification.LIST
|
CollectionClassification.BAG
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -812,19 +812,13 @@ public interface AvailableSettings {
|
||||||
* Hibernate detects a plural attribute typed as {@link java.util.List} with no explicit
|
* Hibernate detects a plural attribute typed as {@link java.util.List} with no explicit
|
||||||
* list index configuration.
|
* list index configuration.
|
||||||
* <p/>
|
* <p/>
|
||||||
* Historically Hibernate interpreted this using
|
|
||||||
* {@linkplain org.hibernate.metamodel.CollectionClassification#BAG BAG} semantics.
|
|
||||||
* Starting in 6.0, Hibernate now interprets this situation using
|
|
||||||
* {@linkplain org.hibernate.metamodel.CollectionClassification#LIST LIST} semantics.
|
|
||||||
* <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} (bag e.g.)
|
* <li>the (case insensitive) name of a {@code CollectionClassification} (list 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.
|
|
||||||
*
|
*
|
||||||
* @since 6.0
|
* @since 6.0
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -21,6 +21,5 @@ hibernate.cache.region_prefix hibernate.test
|
||||||
hibernate.cache.region.factory_class org.hibernate.testing.cache.CachingRegionFactory
|
hibernate.cache.region.factory_class org.hibernate.testing.cache.CachingRegionFactory
|
||||||
|
|
||||||
hibernate.service.allow_crawling=false
|
hibernate.service.allow_crawling=false
|
||||||
|
## make sure we use bag semantics for "implicit" List mappings
|
||||||
## backwards compatibility wrt bag v. list for "implicit" List mappings
|
|
||||||
hibernate.mapping.default_list_semantics=bag
|
hibernate.mapping.default_list_semantics=bag
|
|
@ -260,42 +260,6 @@ plural attribute classification
|
||||||
See https://docs.jboss.org/hibernate/orm/6.0/userguide/html_single/Hibernate_User_Guide.html#collection-type-reg-ann
|
See https://docs.jboss.org/hibernate/orm/6.0/userguide/html_single/Hibernate_User_Guide.html#collection-type-reg-ann
|
||||||
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
|
||||||
|
|
Loading…
Reference in New Issue