Index: openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/xml/TestXmlOverrideEntity.java
===================================================================
--- openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/xml/TestXmlOverrideEntity.java (revision 0)
+++ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/xml/TestXmlOverrideEntity.java (revision 0)
@@ -0,0 +1,54 @@
+package org.apache.openjpa.persistence.xml;
+
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+
+import org.apache.openjpa.persistence.InvalidStateException;
+import org.apache.openjpa.persistence.test.SingleEMTest;
+
+public class TestXmlOverrideEntity extends SingleEMTest {
+
+ public TestXmlOverrideEntity() {
+ super(XmlOverrideEntity.class);
+ }
+
+ protected void setEMFProps(Map props) {
+ super.setEMFProps(props);
+ }
+
+ /**
+ * Tests that the optional attribute on a basic field can be overrided by
+ * an xml descriptor.
+ *
+ * XmlOverrideEntity.name is annotated with optional=false
+ * XmlOverrideEntity.description is annotated with optional=true.
+ *
+ * The optional attributes are reversed in orm.xml.
+ */
+ public void testOptionalAttributeOverride() {
+ EntityManager em = emf.createEntityManager();
+
+ XmlOverrideEntity optional = new XmlOverrideEntity();
+
+ optional.setName(null);
+ optional.setDescription("description");
+
+ em.getTransaction().begin();
+ em.persist(optional);
+ em.getTransaction().commit();
+
+ try {
+ em.getTransaction().begin();
+ optional.setDescription(null);
+ em.getTransaction().commit();
+ fail("XmlOrverrideEntity.description should not be optional. " +
+ "Expecting an InvalidStateException.");
+ } catch (InvalidStateException e) {
+ }
+
+ em.getTransaction().begin();
+ em.remove(em.find(XmlOverrideEntity.class, optional.getId()));
+ em.getTransaction().commit();
+ }
+}
Index: openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/xml/XmlOverrideEntity.java
===================================================================
--- openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/xml/XmlOverrideEntity.java (revision 0)
+++ openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/xml/XmlOverrideEntity.java (revision 0)
@@ -0,0 +1,44 @@
+package org.apache.openjpa.persistence.xml;
+
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+@Entity
+public class XmlOverrideEntity {
+
+ @Id
+ @GeneratedValue
+ int id;
+
+ @Basic(optional=false)
+ String name;
+
+ @Basic(optional=true)
+ String description;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+}
Index: openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/xml/orm.xml
===================================================================
--- openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/xml/orm.xml (revision 523146)
+++ openjpa-persistence-jdbc/src/test/resources/org/apache/openjpa/persistence/xml/orm.xml (working copy)
@@ -20,4 +20,11 @@
-
\ No newline at end of file
+
+
+
+
+
+
+
+
Index: openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
===================================================================
--- openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java (revision 523146)
+++ openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java (working copy)
@@ -1196,6 +1196,12 @@
val = attrs.getValue("optional");
if ("false".equals(val))
fmd.setNullValue(FieldMetaData.NULL_EXCEPTION);
+ else if ("true".equals(val)
+ && fmd.getNullValue() == FieldMetaData.NULL_EXCEPTION) {
+ // Reset value if the field was annotated with optional=false.
+ // Otherwise leave it alone.
+ fmd.setNullValue(FieldMetaData.NULL_UNSET);
+ }
if (isMappingOverrideMode()) {
val = attrs.getValue("mapped-by");
if (val != null)