HHH-16908 Mapping error when using unowned associations as identifiers
This commit is contained in:
parent
93b1b6a48c
commit
28d9c65293
|
@ -208,7 +208,7 @@ public class OneToOneSecondPass implements SecondPass {
|
|||
final KeyValue targetEntityIdentifier = targetEntity.getIdentifier();
|
||||
boolean referenceToPrimaryKey = mappedBy == null
|
||||
|| targetEntityIdentifier instanceof Component
|
||||
&& !( (Component) targetEntityIdentifier ).hasProperty( mappedBy );
|
||||
&& ( (Component) targetEntityIdentifier ).hasProperty( mappedBy );
|
||||
oneToOne.setReferenceToPrimaryKey( referenceToPrimaryKey );
|
||||
|
||||
final String propertyRef = oneToOne.getReferencedPropertyName();
|
||||
|
|
|
@ -90,11 +90,18 @@ public class ToOneBinder {
|
|||
if ( property.isAnnotationPresent( Column.class )
|
||||
|| property.isAnnotationPresent( Columns.class ) ) {
|
||||
throw new AnnotationException(
|
||||
"Property '"+ getPath( propertyHolder, inferredData )
|
||||
"Property '" + getPath( propertyHolder, inferredData )
|
||||
+ "' is a '@ManyToOne' association and may not use '@Column' to specify column mappings (use '@JoinColumn' instead)"
|
||||
);
|
||||
}
|
||||
|
||||
if ( joinColumns.hasMappedBy() && isIdentifier( propertyHolder, propertyBinder, isIdentifierMapper ) ) {
|
||||
throw new AnnotationException(
|
||||
"Property '" + getPath( propertyHolder, inferredData )
|
||||
+ "' is the inverse side of a '@ManyToOne' association and cannot be used as identifier"
|
||||
);
|
||||
}
|
||||
|
||||
final Cascade hibernateCascade = property.getAnnotation( Cascade.class );
|
||||
final NotFound notFound = property.getAnnotation( NotFound.class );
|
||||
final NotFoundAction notFoundAction = notFound == null ? null : notFound.action();
|
||||
|
@ -124,6 +131,13 @@ public class ToOneBinder {
|
|||
);
|
||||
}
|
||||
|
||||
private static boolean isIdentifier(
|
||||
PropertyHolder propertyHolder,
|
||||
PropertyBinder propertyBinder,
|
||||
boolean isIdentifierMapper) {
|
||||
return propertyBinder.isId() || propertyHolder.isOrWithinEmbeddedId() || propertyHolder.isInIdClass() || isIdentifierMapper;
|
||||
}
|
||||
|
||||
private static boolean isMandatory(boolean optional, XProperty property, NotFoundAction notFoundAction) {
|
||||
// @MapsId means the columns belong to the pk;
|
||||
// A @MapsId association (obviously) must be non-null when the entity is first persisted.
|
||||
|
@ -421,12 +435,19 @@ public class ToOneBinder {
|
|||
if ( property.isAnnotationPresent( Column.class )
|
||||
|| property.isAnnotationPresent( Columns.class ) ) {
|
||||
throw new AnnotationException(
|
||||
"Property '"+ getPath( propertyHolder, inferredData )
|
||||
"Property '" + getPath( propertyHolder, inferredData )
|
||||
+ "' is a '@OneToOne' association and may not use '@Column' to specify column mappings"
|
||||
+ " (use '@PrimaryKeyJoinColumn' instead)"
|
||||
);
|
||||
}
|
||||
|
||||
if ( joinColumns.hasMappedBy() && isIdentifier( propertyHolder, propertyBinder, isIdentifierMapper ) ) {
|
||||
throw new AnnotationException(
|
||||
"Property '" + getPath( propertyHolder, inferredData )
|
||||
+ "' is the inverse side of a '@OneToOne' association and cannot be used as identifier"
|
||||
);
|
||||
}
|
||||
|
||||
//FIXME support a proper PKJCs
|
||||
final boolean trueOneToOne = property.isAnnotationPresent( PrimaryKeyJoinColumn.class )
|
||||
|| property.isAnnotationPresent( PrimaryKeyJoinColumns.class );
|
||||
|
|
Loading…
Reference in New Issue