Skip to content

Commit c8dab53

Browse files
committed
HHH-18728 - Allow mixed discriminator-value mappings for ANY
HHH-18729 - Allow custom strategy for implicit discriminator-value determination for ANY
1 parent ffa33c4 commit c8dab53

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/UnifiedAnyDiscriminatorConverter.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
import java.util.function.Consumer;
2323
import java.util.function.Function;
2424

25+
import static org.hibernate.persister.entity.DiscriminatorHelper.NOT_NULL_DISCRIMINATOR;
26+
import static org.hibernate.persister.entity.DiscriminatorHelper.NULL_DISCRIMINATOR;
27+
2528
/**
2629
* @author Steve Ebersole
2730
*/
@@ -60,6 +63,14 @@ private ImplicitDiscriminatorStrategy resolveImplicitValueStrategy(ImplicitDiscr
6063
return FullNameImplicitDiscriminatorStrategy.FULL_NAME_STRATEGY;
6164
}
6265
}
66+
else {
67+
if ( explicitValueMappings.containsKey( NOT_NULL_DISCRIMINATOR ) ) {
68+
if ( implicitValueStrategy != null ) {
69+
// we will ultimately not know how to handle "implicit" values which are non-null
70+
throw new HibernateException( "Illegal use of ImplicitDiscriminatorStrategy with explicit non-null discriminator mapping: " + discriminatorRole.getFullPath() );
71+
}
72+
}
73+
}
6374
return implicitValueStrategy;
6475
}
6576

@@ -80,6 +91,10 @@ public Map<String, DiscriminatorValueDetails> getDetailsByEntityName() {
8091

8192
@Override
8293
public DiscriminatorValueDetails getDetailsForDiscriminatorValue(Object relationalValue) {
94+
if ( relationalValue == null ) {
95+
return detailsByValue.get( NULL_DISCRIMINATOR );
96+
}
97+
8398
final DiscriminatorValueDetails existing = detailsByValue.get( relationalValue );
8499
if ( existing != null ) {
85100
return existing;
@@ -109,6 +124,11 @@ else if ( getRelationalJavaType() instanceof CharacterJavaType ) {
109124
}
110125
}
111126

127+
final DiscriminatorValueDetails nonNullMatch = detailsByValue.get( NOT_NULL_DISCRIMINATOR );
128+
if ( nonNullMatch != null ) {
129+
return nonNullMatch;
130+
}
131+
112132
throw new HibernateException( "Unknown discriminator value (" + discriminatorRole.getFullPath() + ") : " + relationalValue );
113133
}
114134

0 commit comments

Comments
 (0)