before this commit, foreign key is created even ConstraintMode.NO_CONSTRAINT present on the @ManyToOne side
(cherry picked from commit 633d0f08d6039c662437be6c83f9eaef3dbcab71)
Provide an option to skip foreign key creation for ConstraintMode.PROVIDER_DEFAULT
(cherry picked from commit 88acc9511b2e1c1cee7def27ba8dc717a8c321f8)
It's unlikely to ever happen, and even if it happened, the resulting
exception would probably be rather clear about the fact that the problem
is related to concurrent execution (ConcurrentModificationException
thrown by a Map of resources, for example).
See
https://github.com/hibernate/hibernate-orm/pull/3693#discussion_r560393293
Signed-off-by: Yoann Rodière <yoann@hibernate.org>
- Better handle `FetchModeType#LAZY` for to-one associations based on whether bytecode-enhancement-as-proxy is enabled. Minimize the cases a user is likely to need to use `@LazyToOne`
- See also EAP7-1402
(cherry picked from commit 0c974991f7a75f45b2f881539f34eac890d6a191)
This test accesses a field of an entity directly and expects it to be
automatically initialized; this cannot work without extended bytecode
enhancement.
This used to work with Java 8 bytecode, but only by chance. It seems
that Java 8 bytecode relies on "synthetic", static access methods
inserted by the compiler to access the fields of entities in this test:
any access to the field is done through this access method instead of
through a direct field access. Since we apply bytecode enhancement to
all methods of entities, this means that access to fields triggers
initialization, without any bytecode enhancement in the caller class.
I believe this is specific to nested classes, but couldn't find a
source. For reference, the bytecode of access methods looks like this:
static int access$002(org.hibernate.test.bytecode.enhancement.lazy.NaturalIdInUninitializedAssociationTest$AnEntity, int);
Code:
0: aload_0
1: iload_1
2: dup_x1
3: putfield #3 // Field id:I
6: ireturn
static org.hibernate.test.bytecode.enhancement.lazy.NaturalIdInUninitializedAssociationTest$EntityImmutableNaturalId access$102(org.hibernate.test.bytecode.enhancement.lazy.NaturalIdInUninitializedAssociationTest$AnEntity, org.hibernate.test.bytecode.enhancement.lazy.NaturalIdInUninitializedAssociationTest$EntityImmutableNaturalId);
Code:
0: aload_0
1: aload_1
2: dup_x1
3: putfield #2 // Field entityImmutableNaturalId:Lorg/hibernate/test/bytecode/enhancement/lazy/NaturalIdInUninitializedAssociationTest$EntityImmutableNaturalId;
6: areturn
With Java 11, however, access to fields of entities is done directly,
even for nested classes. So the access methods no longer exist, and we
don't get automatic initialization upon field access. We need extended
bytecode enhancement, like we would in any other case of field access
(in particular accessing fields of non-nested classes).