diff --git a/hibernate-core/src/test/java/org/hibernate/test/naturalid/cid/CompositeIdAndNaturalIdTest.java b/hibernate-core/src/test/java/org/hibernate/test/naturalid/cid/CompositeIdAndNaturalIdTest.java
index 244410fb2e..dfc29f90d8 100644
--- a/hibernate-core/src/test/java/org/hibernate/test/naturalid/cid/CompositeIdAndNaturalIdTest.java
+++ b/hibernate-core/src/test/java/org/hibernate/test/naturalid/cid/CompositeIdAndNaturalIdTest.java
@@ -11,9 +11,12 @@ import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.criterion.Restrictions;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.junit.Test;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
/**
@@ -31,6 +34,15 @@ public class CompositeIdAndNaturalIdTest extends BaseCoreFunctionalTestCase {
cfg.setProperty( Environment.GENERATE_STATISTICS, "false" );
}
+ @Test
+ @TestForIssue( jiraKey = "HHH-10360")
+ public void testNaturalIdNullability() {
+ final EntityPersister persister = sessionFactory().getEntityPersister( Account.class.getName() );
+ final int propertyIndex = persister.getEntityMetamodel().getPropertyIndex( "shortCode" );
+ // the natural ID mapped as non-nullable
+ assertFalse( persister.getPropertyNullability()[propertyIndex] );
+ }
+
@Test
public void testSave() {
// prepare some test data...
diff --git a/hibernate-core/src/test/java/org/hibernate/test/naturalid/immutable/ImmutableEntityNaturalIdTest.java b/hibernate-core/src/test/java/org/hibernate/test/naturalid/immutable/ImmutableEntityNaturalIdTest.java
index d86e8987d5..973e0f52b4 100644
--- a/hibernate-core/src/test/java/org/hibernate/test/naturalid/immutable/ImmutableEntityNaturalIdTest.java
+++ b/hibernate-core/src/test/java/org/hibernate/test/naturalid/immutable/ImmutableEntityNaturalIdTest.java
@@ -12,14 +12,17 @@ import java.lang.reflect.Field;
import org.junit.Test;
import org.hibernate.FetchMode;
-import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.criterion.Restrictions;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
+import org.hibernate.tuple.entity.EntityMetamodel;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;
/**
@@ -36,6 +39,17 @@ public class ImmutableEntityNaturalIdTest extends BaseCoreFunctionalTestCase {
cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
}
+ @Test
+ @TestForIssue( jiraKey = "HHH-10360")
+ public void testNaturalIdNullability() {
+ final EntityPersister persister = sessionFactory().getEntityPersister( Child.class.getName() );
+ // nullability is not specified for either properties making up
+ // the natural ID, so they should be non-nullable by hbm-specific default
+ final EntityMetamodel entityMetamodel = persister.getEntityMetamodel();
+ assertFalse( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "parent" )] );
+ assertFalse( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "name" )] );
+ }
+
@Test
public void testNaturalIdCheck() throws Exception {
Session s = openSession();
diff --git a/hibernate-core/src/test/java/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java b/hibernate-core/src/test/java/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java
index b7b79a0625..becd4f5efe 100644
--- a/hibernate-core/src/test/java/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java
+++ b/hibernate-core/src/test/java/org/hibernate/test/naturalid/immutable/ImmutableNaturalIdTest.java
@@ -16,9 +16,12 @@ import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.criterion.Restrictions;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
@@ -37,6 +40,15 @@ public class ImmutableNaturalIdTest extends BaseCoreFunctionalTestCase {
cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
}
+ @Test
+ @TestForIssue( jiraKey = "HHH-10360")
+ public void testNaturalIdNullability() {
+ final EntityPersister persister = sessionFactory().getEntityPersister( User.class.getName() );
+ final int propertyIndex = persister.getEntityMetamodel().getPropertyIndex( "userName" );
+ // nullability is not specified, so it should be non-nullable by hbm-specific default
+ assertFalse( persister.getPropertyNullability()[propertyIndex] );
+ }
+
@Test
public void testUpdate() {
// prepare some test data...
diff --git a/hibernate-core/src/test/java/org/hibernate/test/naturalid/immutableentity/ImmutableEntityNaturalIdTest.java b/hibernate-core/src/test/java/org/hibernate/test/naturalid/immutableentity/ImmutableEntityNaturalIdTest.java
index 9ae72ea0d3..6b2f1aaa86 100644
--- a/hibernate-core/src/test/java/org/hibernate/test/naturalid/immutableentity/ImmutableEntityNaturalIdTest.java
+++ b/hibernate-core/src/test/java/org/hibernate/test/naturalid/immutableentity/ImmutableEntityNaturalIdTest.java
@@ -12,10 +12,13 @@ import org.hibernate.Transaction;
import org.hibernate.annotations.Immutable;
import org.hibernate.cfg.Configuration;
import org.hibernate.metadata.ClassMetadata;
+import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.stat.Statistics;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
+import org.hibernate.tuple.entity.EntityMetamodel;
+
import org.junit.Test;
import static org.junit.Assert.assertEquals;
@@ -44,6 +47,17 @@ public class ImmutableEntityNaturalIdTest extends BaseCoreFunctionalTestCase {
assertEquals( "Wrong number of elements", 3, propertiesIndex.length );
}
+ @Test
+ @TestForIssue( jiraKey = "HHH-10360")
+ public void testNaturalIdNullability() {
+ final EntityPersister persister = sessionFactory().getEntityPersister( Building.class.getName() );
+ final EntityMetamodel entityMetamodel = persister.getEntityMetamodel();
+ // nullability is not specified, so they should be nullable by annotations-specific default
+ assertTrue( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "address" )] );
+ assertTrue( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "city" )] );
+ assertTrue( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "state" )] );
+ }
+
@Test
public void testImmutableNaturalIdLifecycle() {
Statistics stats = sessionFactory().getStatistics();
diff --git a/hibernate-core/src/test/java/org/hibernate/test/naturalid/inheritance/InheritedNaturalIdTest.java b/hibernate-core/src/test/java/org/hibernate/test/naturalid/inheritance/InheritedNaturalIdTest.java
index 34fdf6a967..92a23305ad 100644
--- a/hibernate-core/src/test/java/org/hibernate/test/naturalid/inheritance/InheritedNaturalIdTest.java
+++ b/hibernate-core/src/test/java/org/hibernate/test/naturalid/inheritance/InheritedNaturalIdTest.java
@@ -9,11 +9,15 @@ package org.hibernate.test.naturalid.inheritance;
import org.junit.Test;
import org.hibernate.Session;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
+import org.hibernate.tuple.entity.EntityMetamodel;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
/**
* @author Steve Ebersole
@@ -24,6 +28,15 @@ public class InheritedNaturalIdTest extends BaseCoreFunctionalTestCase {
return new Class[] { Principal.class, User.class };
}
+ @Test
+ @TestForIssue( jiraKey = "HHH-10360")
+ public void testNaturalIdNullability() {
+ final EntityPersister persister = sessionFactory().getEntityPersister( User.class.getName() );
+ final EntityMetamodel entityMetamodel = persister.getEntityMetamodel();
+ // nullability is not specified, so it should be nullable by annotations-specific default
+ assertTrue( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "uid" )] );
+ }
+
@Test
public void testIt() {
Session s = openSession();
diff --git a/hibernate-core/src/test/java/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java b/hibernate-core/src/test/java/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java
index 8236d9f323..060ae6fb7e 100755
--- a/hibernate-core/src/test/java/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java
+++ b/hibernate-core/src/test/java/org/hibernate/test/naturalid/mutable/MutableNaturalIdTest.java
@@ -17,9 +17,13 @@ import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.criterion.Restrictions;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
+import org.hibernate.tuple.entity.EntityMetamodel;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
@@ -40,6 +44,16 @@ public class MutableNaturalIdTest extends BaseCoreFunctionalTestCase {
cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
}
+ @Test
+ @TestForIssue( jiraKey = "HHH-10360")
+ public void testNaturalIdNullability() {
+ final EntityPersister persister = sessionFactory().getEntityPersister( User.class.getName() );
+ final EntityMetamodel entityMetamodel = persister.getEntityMetamodel();
+ // nullability is not specified, so it should be non-nullable by hbm-specific default
+ assertFalse( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "name" )] );
+ assertFalse( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "org" )] );
+ }
+
@Test
public void testCacheSynchronizationOnMutation() {
Session s = openSession();
diff --git a/hibernate-core/src/test/java/org/hibernate/test/naturalid/nullable/NullableNaturalIdTest.java b/hibernate-core/src/test/java/org/hibernate/test/naturalid/nullable/NullableNaturalIdTest.java
index 7401b25c5f..cea816331f 100644
--- a/hibernate-core/src/test/java/org/hibernate/test/naturalid/nullable/NullableNaturalIdTest.java
+++ b/hibernate-core/src/test/java/org/hibernate/test/naturalid/nullable/NullableNaturalIdTest.java
@@ -9,10 +9,15 @@ package org.hibernate.test.naturalid.nullable;
import org.junit.Test;
import org.hibernate.Session;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
+import org.hibernate.tuple.entity.EntityMetamodel;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
/**
* @author Steve Ebersole
@@ -23,6 +28,46 @@ public class NullableNaturalIdTest extends BaseCoreFunctionalTestCase {
return new Class[] { A.class, B.class, C.class, D.class };
}
+ @Override
+ public String[] getMappings() {
+ return new String[] { "naturalid/nullable/User.hbm.xml" };
+ }
+
+ @Test
+ @TestForIssue( jiraKey = "HHH-10360")
+ public void testNaturalIdNullability() {
+ // A, B, C, and D are mapped using annotations;
+ // none are mapped to be non-nullable, so all are nullable by annotations-specific default,
+ // except primitives
+ EntityPersister persister = sessionFactory().getEntityPersister( A.class.getName() );
+ EntityMetamodel entityMetamodel = persister.getEntityMetamodel();
+ assertTrue( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "assC" )] );
+ assertTrue( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "myname" )] );
+
+ persister = sessionFactory().getEntityPersister( B.class.getName() );
+ entityMetamodel = persister.getEntityMetamodel();
+ assertTrue( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "assA" )] );
+ // naturalid is a primitive, so it is non-nullable
+ assertFalse( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "naturalid" )] );
+
+ persister = sessionFactory().getEntityPersister( C.class.getName() );
+ entityMetamodel = persister.getEntityMetamodel();
+ assertTrue( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "name" )] );
+
+ persister = sessionFactory().getEntityPersister( D.class.getName() );
+ entityMetamodel = persister.getEntityMetamodel();
+ assertTrue( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "name" )] );
+ assertTrue( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "associatedC" )] );
+
+ // User is mapped using hbm.xml; properties are explicitly mapped to be nullable
+ persister = sessionFactory().getEntityPersister( User.class.getName() );
+ entityMetamodel = persister.getEntityMetamodel();
+ assertTrue( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "name" )] );
+ assertTrue( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "org" )] );
+ // intVal is a primitive; hbm.xml apparently allows primitive to be nullable
+ assertTrue( persister.getPropertyNullability()[entityMetamodel.getPropertyIndex( "intVal" )] );
+ }
+
@Test
public void testNaturalIdNullValueOnPersist() {
Session session = openSession();
diff --git a/hibernate-core/src/test/java/org/hibernate/test/naturalid/nullable/User.hbm.xml b/hibernate-core/src/test/java/org/hibernate/test/naturalid/nullable/User.hbm.xml
new file mode 100755
index 0000000000..cd5fe4be08
--- /dev/null
+++ b/hibernate-core/src/test/java/org/hibernate/test/naturalid/nullable/User.hbm.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/hibernate-core/src/test/java/org/hibernate/test/naturalid/nullable/User.java b/hibernate-core/src/test/java/org/hibernate/test/naturalid/nullable/User.java
new file mode 100755
index 0000000000..c73ba3521e
--- /dev/null
+++ b/hibernate-core/src/test/java/org/hibernate/test/naturalid/nullable/User.java
@@ -0,0 +1,61 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
+ * See the lgpl.txt file in the root directory or .
+ */
+
+//$Id: User.java 6900 2005-05-25 01:24:22Z oneovthafew $
+package org.hibernate.test.naturalid.nullable;
+
+
+/**
+ * @author Gavin King
+ */
+public class User {
+ private Long id;
+ private String name;
+ private String org;
+ private String password;
+ private int intVal;
+
+ User() {}
+
+ public User(String name, String org, String password) {
+ this.name = name;
+ this.org = org;
+ this.password = password;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getOrg() {
+ return org;
+ }
+
+ public void setOrg(String org) {
+ this.org = org;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public int getIntVal() {
+ return intVal;
+ }
+
+ public void setIntVal(int intVal) {
+ this.intVal = intVal;
+ }
+}