Skip to content

Commit 15a953b

Browse files
committed
some nice minor refactorings to binders
1 parent 9a84f8d commit 15a953b

File tree

3 files changed

+76
-84
lines changed

3 files changed

+76
-84
lines changed

hibernate-core/src/main/java/org/hibernate/boot/model/internal/BinderHelper.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.hibernate.mapping.PersistentClass;
3636
import org.hibernate.mapping.Property;
3737
import org.hibernate.mapping.Selectable;
38+
import org.hibernate.mapping.SimpleValue;
3839
import org.hibernate.mapping.SyntheticProperty;
3940
import org.hibernate.mapping.ToOne;
4041
import org.hibernate.mapping.Value;
@@ -65,6 +66,7 @@
6566
import static org.hibernate.boot.model.internal.ForeignKeyType.NON_PRIMARY_KEY_REFERENCE;
6667
import static org.hibernate.internal.log.DeprecationLogger.DEPRECATION_LOGGER;
6768
import static org.hibernate.internal.util.StringHelper.isEmpty;
69+
import static org.hibernate.internal.util.StringHelper.nullIfEmpty;
6870
import static org.hibernate.internal.util.StringHelper.qualifier;
6971
import static org.hibernate.internal.util.StringHelper.qualify;
7072
import static org.hibernate.internal.util.collections.ArrayHelper.isEmpty;
@@ -1003,7 +1005,7 @@ private static boolean checkReferencedClass(PersistentClass ownerClass, Persiste
10031005
return false;
10041006
}
10051007

1006-
public static boolean noConstraint(ForeignKey foreignKey, boolean noConstraintByDefault) {
1008+
static boolean noConstraint(ForeignKey foreignKey, boolean noConstraintByDefault) {
10071009
if ( foreignKey == null ) {
10081010
return false;
10091011
}
@@ -1014,6 +1016,31 @@ public static boolean noConstraint(ForeignKey foreignKey, boolean noConstraintBy
10141016
}
10151017
}
10161018

1019+
static void handleForeignKeyConstraint(
1020+
SimpleValue key,
1021+
ForeignKey foreignKey,
1022+
ForeignKey nestedForeignKey,
1023+
MetadataBuildingContext context) {
1024+
final boolean noConstraintByDefault = context.getBuildingOptions().isNoConstraintByDefault();
1025+
if ( noConstraint( foreignKey, noConstraintByDefault )
1026+
|| noConstraint( nestedForeignKey, noConstraintByDefault ) ) {
1027+
key.disableForeignKey();
1028+
}
1029+
else if ( foreignKey != null ) {
1030+
key.setForeignKeyName( nullIfEmpty( foreignKey.name() ) );
1031+
key.setForeignKeyDefinition( nullIfEmpty( foreignKey.foreignKeyDefinition() ) );
1032+
key.setForeignKeyOptions( foreignKey.options() );
1033+
}
1034+
else if ( noConstraintByDefault ) {
1035+
key.disableForeignKey();
1036+
}
1037+
else if ( nestedForeignKey != null ) {
1038+
key.setForeignKeyName( nullIfEmpty( nestedForeignKey.name() ) );
1039+
key.setForeignKeyDefinition( nullIfEmpty( nestedForeignKey.foreignKeyDefinition() ) );
1040+
key.setForeignKeyOptions( nestedForeignKey.options() );
1041+
}
1042+
}
1043+
10171044
/**
10181045
* Extract an annotation from the package-info for the package the given class is defined in
10191046
*

hibernate-core/src/main/java/org/hibernate/boot/model/internal/EntityBinder.java

Lines changed: 30 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import jakarta.persistence.GeneratedValue;
1717
import jakarta.persistence.IdClass;
1818
import jakarta.persistence.Inheritance;
19+
import jakarta.persistence.InheritanceType;
1920
import jakarta.persistence.JoinColumn;
2021
import jakarta.persistence.JoinTable;
2122
import jakarta.persistence.MappedSuperclass;
@@ -93,8 +94,8 @@
9394
import static org.hibernate.boot.model.internal.BinderHelper.extractFromPackage;
9495
import static org.hibernate.boot.model.internal.BinderHelper.getMappedSuperclassOrNull;
9596
import static org.hibernate.boot.model.internal.BinderHelper.getPath;
97+
import static org.hibernate.boot.model.internal.BinderHelper.handleForeignKeyConstraint;
9698
import static org.hibernate.boot.model.internal.BinderHelper.hasToOneAnnotation;
97-
import static org.hibernate.boot.model.internal.BinderHelper.noConstraint;
9899
import static org.hibernate.boot.model.internal.BinderHelper.toAliasEntityMap;
99100
import static org.hibernate.boot.model.internal.BinderHelper.toAliasTableMap;
100101
import static org.hibernate.boot.model.internal.DialectOverridesAnnotationHelper.getOverridableAnnotation;
@@ -505,8 +506,7 @@ private boolean mapAsIdClass(
505506
classWithIdClass,
506507
compositeType,
507508
baseInferredData,
508-
propertyAccessor,
509-
true
509+
propertyAccessor
510510
);
511511
if ( idClassComponent.isSimpleRecord() ) {
512512
mapper.setSimpleRecord( true );
@@ -552,8 +552,7 @@ private Component createMapperProperty(
552552
ClassDetails classWithIdClass,
553553
TypeDetails compositeClass,
554554
PropertyData baseInferredData,
555-
AccessType propertyAccessor,
556-
boolean isIdClass) {
555+
AccessType propertyAccessor) {
557556
final var mapper = createMapper(
558557
inheritanceStates,
559558
persistentClass,
@@ -562,8 +561,7 @@ private Component createMapperProperty(
562561
classWithIdClass,
563562
compositeClass,
564563
baseInferredData,
565-
propertyAccessor,
566-
isIdClass
564+
propertyAccessor
567565
);
568566
final var mapperProperty = new SyntheticProperty();
569567
mapperProperty.setName( NavigablePath.IDENTIFIER_MAPPER_PROPERTY );
@@ -583,8 +581,7 @@ private Component createMapper(
583581
ClassDetails classWithIdClass,
584582
TypeDetails compositeClass,
585583
PropertyData baseInferredData,
586-
AccessType propertyAccessor,
587-
boolean isIdClass) {
584+
AccessType propertyAccessor) {
588585
final var mapper = fillEmbeddable(
589586
propertyHolder,
590587
new PropertyPreloadedData(
@@ -605,7 +602,7 @@ private Component createMapper(
605602
null,
606603
context,
607604
inheritanceStates,
608-
isIdClass
605+
true
609606
);
610607
persistentClass.setIdentifierMapper( mapper );
611608

@@ -824,38 +821,39 @@ private void handleInheritance(
824821
InheritanceState inheritanceState,
825822
PersistentClass superEntity,
826823
PropertyHolder propertyHolder) {
827-
final boolean isJoinedSubclass;
828824
switch ( inheritanceState.getType() ) {
829825
case JOINED:
830826
joinedInheritance( inheritanceState, superEntity, propertyHolder );
831-
isJoinedSubclass = inheritanceState.hasParents();
832827
break;
833828
case SINGLE_TABLE:
834829
singleTableInheritance( inheritanceState, propertyHolder );
835-
isJoinedSubclass = false;
836830
break;
837831
case TABLE_PER_CLASS:
838-
isJoinedSubclass = false;
839832
break;
840833
default:
841834
throw new AssertionFailure( "Unrecognized InheritanceType" );
842835
}
843836

844837
bindDiscriminatorValue();
845838

846-
if ( !isJoinedSubclass ) {
839+
if ( !isJoinedSubclass( inheritanceState ) ) {
847840
checkNoJoinColumns( annotatedClass );
848841
checkNoOnDelete( annotatedClass );
849842
}
850843
}
851844

845+
private static boolean isJoinedSubclass(InheritanceState inheritanceState) {
846+
return inheritanceState.getType() == InheritanceType.JOINED
847+
&& inheritanceState.hasParents();
848+
}
849+
852850
private void singleTableInheritance(InheritanceState inheritanceState, PropertyHolder holder) {
853851
final var discriminatorColumn = processSingleTableDiscriminatorProperties( inheritanceState );
854852
// todo : sucks that this is separate from RootClass distinction
855853
if ( !inheritanceState.hasParents() ) {
856-
final var rootClass = (RootClass) persistentClass;
857854
if ( inheritanceState.hasSiblings()
858855
|| discriminatorColumn != null && !discriminatorColumn.isImplicit() ) {
856+
final var rootClass = (RootClass) persistentClass;
859857
bindDiscriminatorColumnToRootPersistentClass( rootClass, discriminatorColumn, holder );
860858
if ( context.getBuildingOptions().shouldImplicitlyForceDiscriminatorInSelect() ) {
861859
rootClass.setForceDiscriminator( true );
@@ -870,7 +868,7 @@ private void joinedInheritance(InheritanceState state, PersistentClass superEnti
870868
final var joinedSubclass = (JoinedSubclass) persistentClass;
871869
final var key = new DependantValue( context, joinedSubclass.getTable(), joinedSubclass.getIdentifier() );
872870
joinedSubclass.setKey( key );
873-
handleForeignKeys( annotatedClass, context, key );
871+
handleForeignKey( annotatedClass, context, key );
874872
final var onDelete = annotatedClass.getAnnotationUsage( OnDelete.class, modelsContext() );
875873
key.setOnDeleteAction( onDelete == null ? null : onDelete.action() );
876874
//we are never in a second pass at that stage, so queue it
@@ -880,14 +878,15 @@ private void joinedInheritance(InheritanceState state, PersistentClass superEnti
880878
}
881879

882880
final var discriminatorColumn = processJoinedDiscriminatorProperties( state );
883-
if ( !state.hasParents() ) { // todo : sucks that this is separate from RootClass distinction
884-
final var rootClass = (RootClass) persistentClass;
881+
// todo : sucks that this is separate from RootClass distinction
882+
if ( !state.hasParents() ) {
885883
// the class we're processing is the root of the hierarchy, so
886884
// let's see if we had a discriminator column (it's perfectly
887885
// valid for joined inheritance to not have a discriminator)
888886
if ( discriminatorColumn != null ) {
889887
// we do have a discriminator column
890888
if ( state.hasSiblings() || !discriminatorColumn.isImplicit() ) {
889+
final var rootClass = (RootClass) persistentClass;
891890
bindDiscriminatorColumnToRootPersistentClass( rootClass, discriminatorColumn, holder );
892891
if ( context.getBuildingOptions().shouldImplicitlyForceDiscriminatorInSelect() ) {
893892
rootClass.setForceDiscriminator( true );
@@ -912,39 +911,22 @@ private void checkNoOnDelete(ClassDetails annotatedClass) {
912911
}
913912
}
914913

915-
private void handleForeignKeys(ClassDetails clazzToProcess, MetadataBuildingContext context, DependantValue key) {
914+
private static void handleForeignKey(ClassDetails clazzToProcess, MetadataBuildingContext context, DependantValue key) {
915+
final var foreignKey = clazzToProcess.getDirectAnnotationUsage( ForeignKey.class );
916+
handleForeignKeyConstraint( key, foreignKey, nestedForeignKey( clazzToProcess ), context );
917+
}
918+
919+
private static ForeignKey nestedForeignKey(ClassDetails clazzToProcess) {
916920
final var pkJoinColumn = clazzToProcess.getDirectAnnotationUsage( PrimaryKeyJoinColumn.class );
917921
final var pkJoinColumns = clazzToProcess.getDirectAnnotationUsage( PrimaryKeyJoinColumns.class );
918-
final boolean noConstraintByDefault = context.getBuildingOptions().isNoConstraintByDefault();
919-
if ( pkJoinColumn != null && noConstraint( pkJoinColumn.foreignKey(), noConstraintByDefault )
920-
|| pkJoinColumns != null && noConstraint( pkJoinColumns.foreignKey(), noConstraintByDefault ) ) {
921-
key.disableForeignKey();
922+
if ( pkJoinColumn != null ) {
923+
return pkJoinColumn.foreignKey();
924+
}
925+
else if ( pkJoinColumns != null ) {
926+
return pkJoinColumns.foreignKey();
922927
}
923928
else {
924-
final var foreignKey = clazzToProcess.getDirectAnnotationUsage( ForeignKey.class );
925-
if ( noConstraint( foreignKey, noConstraintByDefault ) ) {
926-
key.disableForeignKey();
927-
}
928-
else if ( foreignKey != null ) {
929-
key.setForeignKeyName( nullIfEmpty( foreignKey.name() ) );
930-
key.setForeignKeyDefinition( nullIfEmpty( foreignKey.foreignKeyDefinition() ) );
931-
key.setForeignKeyOptions( foreignKey.options() );
932-
}
933-
else if ( noConstraintByDefault ) {
934-
key.disableForeignKey();
935-
}
936-
else if ( pkJoinColumns != null ) {
937-
final var nestedFk = pkJoinColumns.foreignKey();
938-
key.setForeignKeyName( nullIfEmpty( nestedFk.name() ) );
939-
key.setForeignKeyDefinition( nullIfEmpty( nestedFk.foreignKeyDefinition() ) );
940-
key.setForeignKeyOptions( nestedFk.options() );
941-
}
942-
else if ( pkJoinColumn != null ) {
943-
final var nestedFk = pkJoinColumn.foreignKey();
944-
key.setForeignKeyName( nullIfEmpty( nestedFk.name() ) );
945-
key.setForeignKeyDefinition( nullIfEmpty( nestedFk.foreignKeyDefinition() ) );
946-
key.setForeignKeyOptions( nestedFk.options() );
947-
}
929+
return null;
948930
}
949931
}
950932

hibernate-core/src/main/java/org/hibernate/boot/model/internal/ToOneBinder.java

Lines changed: 18 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
import static org.hibernate.boot.model.internal.BinderHelper.getFetchMode;
4949
import static org.hibernate.boot.model.internal.BinderHelper.getPath;
5050
import static org.hibernate.boot.model.internal.BinderHelper.isDefault;
51-
import static org.hibernate.boot.model.internal.BinderHelper.noConstraint;
51+
import static org.hibernate.boot.model.internal.BinderHelper.handleForeignKeyConstraint;
5252
import static org.hibernate.internal.CoreLogging.messageLogger;
5353
import static org.hibernate.internal.util.StringHelper.isBlank;
5454
import static org.hibernate.internal.util.StringHelper.nullIfEmpty;
@@ -580,46 +580,29 @@ private static boolean isMappedToPrimaryKey(
580580

581581
public static void bindForeignKeyNameAndDefinition(
582582
SimpleValue value,
583-
MemberDetails property,
583+
MemberDetails memberDetails,
584584
ForeignKey foreignKey,
585585
MetadataBuildingContext context) {
586-
if ( property.hasDirectAnnotationUsage( NotFound.class ) ) {
586+
if ( memberDetails.hasDirectAnnotationUsage( NotFound.class ) ) {
587587
// supersedes all others
588588
value.disableForeignKey();
589589
}
590590
else {
591-
final var joinColumn = property.getDirectAnnotationUsage( JoinColumn.class );
592-
final var joinColumns = property.getDirectAnnotationUsage( JoinColumns.class );
593-
final boolean noConstraintByDefault = context.getBuildingOptions().isNoConstraintByDefault();
594-
if ( joinColumn != null && noConstraint( joinColumn.foreignKey(), noConstraintByDefault )
595-
|| joinColumns != null && noConstraint( joinColumns.foreignKey(), noConstraintByDefault ) ) {
596-
value.disableForeignKey();
597-
}
598-
else {
599-
if ( noConstraint( foreignKey, noConstraintByDefault ) ) {
600-
value.disableForeignKey();
601-
}
602-
else if ( foreignKey != null ) {
603-
value.setForeignKeyName( nullIfEmpty( foreignKey.name() ) );
604-
value.setForeignKeyDefinition( nullIfEmpty( foreignKey.foreignKeyDefinition() ) );
605-
value.setForeignKeyOptions( foreignKey.options() );
606-
}
607-
else if ( noConstraintByDefault ) {
608-
value.disableForeignKey();
609-
}
610-
else if ( joinColumns != null ) {
611-
final var joinColumnsForeignKey = joinColumns.foreignKey();
612-
value.setForeignKeyName( nullIfEmpty( joinColumnsForeignKey.name() ) );
613-
value.setForeignKeyDefinition( nullIfEmpty( joinColumnsForeignKey.foreignKeyDefinition() ) );
614-
value.setForeignKeyOptions( joinColumnsForeignKey.options() );
615-
}
616-
else if ( joinColumn != null ) {
617-
final var joinColumnForeignKey = joinColumn.foreignKey();
618-
value.setForeignKeyName( nullIfEmpty( joinColumnForeignKey.name() ) );
619-
value.setForeignKeyDefinition( nullIfEmpty( joinColumnForeignKey.foreignKeyDefinition() ) );
620-
value.setForeignKeyOptions( joinColumnForeignKey.options() );
621-
}
622-
}
591+
handleForeignKeyConstraint( value, foreignKey, nestedForeignKey( memberDetails ), context );
592+
}
593+
}
594+
595+
private static ForeignKey nestedForeignKey(MemberDetails memberDetails) {
596+
final var joinColumn = memberDetails.getDirectAnnotationUsage( JoinColumn.class );
597+
final var joinColumns = memberDetails.getDirectAnnotationUsage( JoinColumns.class );
598+
if ( joinColumn != null ) {
599+
return joinColumn.foreignKey();
600+
}
601+
else if ( joinColumns != null ) {
602+
return joinColumns.foreignKey();
603+
}
604+
else {
605+
return null;
623606
}
624607
}
625608

0 commit comments

Comments
 (0)