Class BinderHelper
-
Field Summary
-
Method Summary
Modifier and TypeMethodDescriptionstatic Any
buildAnyValue
(Column discriminatorColumn, Formula discriminatorFormula, AnnotatedJoinColumns keyColumns, PropertyData inferredData, OnDeleteAction onDeleteAction, boolean lazy, Nullability nullability, PropertyHolder propertyHolder, EntityBinder entityBinder, boolean optional, MetadataBuildingContext context) static void
checkMappedByType
(String mappedBy, Value targetValue, String propertyName, PropertyHolder propertyHolder, Map<String, PersistentClass> persistentClasses) static void
createSyntheticPropertyReference
(AnnotatedJoinColumns joinColumns, PersistentClass targetEntity, PersistentClass associatedEntity, Value value, String propertyName, boolean inverse, MetadataBuildingContext context) Here we address a fundamental problem: the@JoinColumn
annotation specifies the referenced column in the target table viareferencedColumnName
, but Hibernate needs to know which property or field of the target entity class holds the value of the referenced column at the Java level.static <A extends Annotation>
AextractFromPackage
(Class<A> annotationType, org.hibernate.annotations.common.reflection.XClass xClass, MetadataBuildingContext context) Extract an annotation from the package-info for the package the given class is defined instatic AttributeContainer
findColumnOwner
(PersistentClass persistentClass, String columnName, MetadataBuildingContext context) Find the column owner (ie PersistentClass or Join) of columnName.static Property
findPropertyByName
(Component component, String propertyName) Retrieve the property by path in a recursive waystatic Property
findPropertyByName
(PersistentClass associatedClass, String propertyName) Retrieve the property by path in a recursive way, including IdentifierProperty in the loop If propertyName is null or empty, the IdentifierProperty is returnedstatic AttributeContainer
findReferencedColumnOwner
(PersistentClass persistentClass, AnnotatedJoinColumn joinColumn, MetadataBuildingContext context) static String
getCascadeStrategy
(CascadeType[] ejbCascades, Cascade hibernateCascadeAnnotation, boolean orphanRemoval, boolean forcePersist) static FetchMode
getFetchMode
(FetchType fetch) static MappedSuperclass
getMappedSuperclassOrNull
(org.hibernate.annotations.common.reflection.XClass declaringClass, Map<org.hibernate.annotations.common.reflection.XClass, InheritanceState> inheritanceStatePerClass, MetadataBuildingContext context) static <T extends Annotation>
TgetOverridableAnnotation
(org.hibernate.annotations.common.reflection.XAnnotatedElement element, Class<T> annotationType, MetadataBuildingContext context) static String
getPath
(PropertyHolder holder, PropertyData property) static String
getRelativePath
(PropertyHolder propertyHolder, String propertyName) static boolean
hasToOneAnnotation
(org.hibernate.annotations.common.reflection.XAnnotatedElement property) static boolean
isDefault
(org.hibernate.annotations.common.reflection.XClass clazz, MetadataBuildingContext context) static boolean
isPrimitive
(String elementTypeName) static boolean
noConstraint
(ForeignKey foreignKey, boolean noConstraintByDefault) static Property
shallowCopy
(Property property) toAliasEntityMap
(SqlFragmentAlias[] aliases) toAliasTableMap
(SqlFragmentAlias[] aliases)
-
Field Details
-
PRIMITIVE_NAMES
-
-
Method Details
-
isPrimitive
-
createSyntheticPropertyReference
public static void createSyntheticPropertyReference(AnnotatedJoinColumns joinColumns, PersistentClass targetEntity, PersistentClass associatedEntity, Value value, String propertyName, boolean inverse, MetadataBuildingContext context) Here we address a fundamental problem: the@JoinColumn
annotation specifies the referenced column in the target table viareferencedColumnName
, but Hibernate needs to know which property or field of the target entity class holds the value of the referenced column at the Java level. (It's going to need the value when it writes the association.)Complicating this hugely is the fact that an association might be based on a composite key with multiple
@JoinColumn
s, and so the referenced columns might even be spread out over multiple fields or properties of the target entity. There's even some extra minor complications resulting from multi-table inheritance and secondary tables.The solution here is:
- if the referenced columns correspond to exactly one property of the target entity, we're good, just use it, or
- otherwise, if a composite key is spread out over multiple
properties, then create a "synthetic"
Component
in the model that aggregates these properties and is considered the target of the association.
Certain limitations arise from the way this solution is currently implemented: for example, if a referenced column belongs to a property of an
@Embeddable
, then every column of that embeddable must occur in the list of referenced columns, and the order of the columns must line up! Some of these limitations could be relaxed by writing a better algorithm for building the syntheticComponent
. -
shallowCopy
-
findPropertyByName
Retrieve the property by path in a recursive way, including IdentifierProperty in the loop If propertyName is null or empty, the IdentifierProperty is returned -
findPropertyByName
Retrieve the property by path in a recursive way -
getRelativePath
-
findReferencedColumnOwner
public static AttributeContainer findReferencedColumnOwner(PersistentClass persistentClass, AnnotatedJoinColumn joinColumn, MetadataBuildingContext context) -
findColumnOwner
public static AttributeContainer findColumnOwner(PersistentClass persistentClass, String columnName, MetadataBuildingContext context) Find the column owner (ie PersistentClass or Join) of columnName. If columnName is null or empty, persistentClass is returned -
buildAnyValue
public static Any buildAnyValue(Column discriminatorColumn, Formula discriminatorFormula, AnnotatedJoinColumns keyColumns, PropertyData inferredData, OnDeleteAction onDeleteAction, boolean lazy, Nullability nullability, PropertyHolder propertyHolder, EntityBinder entityBinder, boolean optional, MetadataBuildingContext context) -
getMappedSuperclassOrNull
public static MappedSuperclass getMappedSuperclassOrNull(org.hibernate.annotations.common.reflection.XClass declaringClass, Map<org.hibernate.annotations.common.reflection.XClass, InheritanceState> inheritanceStatePerClass, MetadataBuildingContext context) -
getPath
-
toAliasTableMap
-
toAliasEntityMap
-
hasToOneAnnotation
public static boolean hasToOneAnnotation(org.hibernate.annotations.common.reflection.XAnnotatedElement property) -
getOverridableAnnotation
public static <T extends Annotation> T getOverridableAnnotation(org.hibernate.annotations.common.reflection.XAnnotatedElement element, Class<T> annotationType, MetadataBuildingContext context) -
getFetchMode
-
getCascadeStrategy
public static String getCascadeStrategy(CascadeType[] ejbCascades, Cascade hibernateCascadeAnnotation, boolean orphanRemoval, boolean forcePersist) -
isDefault
public static boolean isDefault(org.hibernate.annotations.common.reflection.XClass clazz, MetadataBuildingContext context) -
checkMappedByType
public static void checkMappedByType(String mappedBy, Value targetValue, String propertyName, PropertyHolder propertyHolder, Map<String, PersistentClass> persistentClasses) -
noConstraint
-
extractFromPackage
public static <A extends Annotation> A extractFromPackage(Class<A> annotationType, org.hibernate.annotations.common.reflection.XClass xClass, MetadataBuildingContext context) Extract an annotation from the package-info for the package the given class is defined in- Parameters:
annotationType
- The type of annotation to returnxClass
- The class in the packagecontext
- The processing context- Returns:
- The annotation or
null
-