Skip to content

Commit 43c3bf6

Browse files
committed
HHH-19279 @basic annotation should not mark primitive fields as optional
as specified by Javadoc of Basic.optional()
1 parent 0768d53 commit 43c3bf6

File tree

2 files changed

+17
-20
lines changed

2 files changed

+17
-20
lines changed

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

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,26 +1264,25 @@ private boolean shouldForceNotNull(Nullability nullability, boolean optional) {
12641264
* Should this property be considered optional, without considering
12651265
* whether it is primitive?
12661266
*
1267-
* @apiNote Poorly named to a degree. The intention is really whether non-optional is explicit
1267+
* @apiNote Poorly named to a degree.
1268+
* The intention is really whether non-optional is explicit
12681269
*/
12691270
private static boolean isExplicitlyOptional(MemberDetails attributeMember) {
1270-
final Basic basicAnn = attributeMember.getDirectAnnotationUsage( Basic.class );
1271-
if ( basicAnn == null ) {
1272-
// things are optional (nullable) by default. If there is no annotation, that cannot be altered
1273-
return true;
1274-
}
1275-
1276-
return basicAnn.optional();
1271+
final Basic basic = attributeMember.getDirectAnnotationUsage( Basic.class );
1272+
// things are optional (nullable) by default.
1273+
// If there is no annotation, that cannot be altered
1274+
return basic == null || basic.optional();
12771275
}
12781276

12791277
/**
1280-
* Should this property be considered optional, taking into
1281-
* account whether it is primitive?
1278+
* Should this property be considered optional, taking into account
1279+
* whether it is primitive?
12821280
*/
12831281
public static boolean isOptional(MemberDetails attributeMember, PropertyHolder propertyHolder) {
1284-
final Basic basicAnn = attributeMember.getDirectAnnotationUsage( Basic.class );
1285-
if ( basicAnn != null ) {
1286-
return basicAnn.optional();
1282+
final Basic basic = attributeMember.getDirectAnnotationUsage( Basic.class );
1283+
if ( basic != null ) {
1284+
return basic.optional()
1285+
&& attributeMember.getType().getTypeKind() != TypeDetails.Kind.PRIMITIVE;
12871286
}
12881287
else if ( attributeMember.isArray() ) {
12891288
return true;
Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,11 @@
1212
import org.hibernate.boot.MetadataSources;
1313
import org.hibernate.mapping.PersistentClass;
1414
import org.hibernate.testing.orm.junit.JiraKey;
15-
import org.hibernate.testing.orm.junit.NotImplementedYet;
1615
import org.hibernate.testing.orm.junit.ServiceRegistry;
1716
import org.hibernate.testing.orm.junit.ServiceRegistryScope;
1817
import org.junit.jupiter.api.Test;
1918

20-
import static org.junit.jupiter.api.Assertions.assertTrue;
19+
import static org.junit.jupiter.api.Assertions.assertFalse;
2120

2221
/**
2322
* <pre>
@@ -37,17 +36,16 @@
3736
*/
3837
@ServiceRegistry()
3938
@JiraKey("HHH-19279")
40-
class ImpliciteOptionalBooleanBasicTest {
39+
class ImplicitOptionalBooleanBasicTest {
4140

42-
@NotImplementedYet
4341
@Test
44-
void testImpliciteOptionalBooleanBasic(ServiceRegistryScope registryScope) {
42+
void testImplicitOptionalBooleanBasic(ServiceRegistryScope registryScope) {
4543
final MetadataSources metadataSources = new MetadataSources( registryScope.getRegistry() )
4644
.addAnnotatedClasses( BooleanBasicTest.class );
4745
Metadata metadata = metadataSources.buildMetadata();
4846
PersistentClass entityBinding = metadata.getEntityBinding( BooleanBasicTest.class.getName() );
49-
assertTrue( entityBinding.getProperty( "booleanWithBasic" ).isOptional(), "booleanWithBasic property is not optional" );
50-
assertTrue( entityBinding.getProperty( "booleanWithoutBasic" ).isOptional(), "booleanWithoutBasic property is not optional" );
47+
assertFalse( entityBinding.getProperty( "booleanWithBasic" ).isOptional(), "primitive property is optional" );
48+
assertFalse( entityBinding.getProperty( "booleanWithoutBasic" ).isOptional(), "primitive property is optional" );
5149
}
5250

5351
@Entity

0 commit comments

Comments
 (0)