You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2006/05/01 16:43:38 UTC

svn commit: r398607 - in /incubator/cayenne/jpa/trunk/cayenne-jpa/src: main/java/org/apache/cayenne/jpa/bridge/ main/java/org/apache/cayenne/jpa/conf/ main/java/org/apache/cayenne/jpa/map/ test/java/org/apache/cayenne/jpa/bridge/ test/java/org/apache/c...

Author: aadamchik
Date: Mon May  1 07:43:36 2006
New Revision: 398607

URL: http://svn.apache.org/viewcvs?rev=398607&view=rev
Log:
fixing temporal type conversion and defaults

Modified:
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessor.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/map/JpaAttribute.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/map/JpaId.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapMappingAssertion.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/MockAnnotatedBean3.java
    incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/entity/cayenne/MockCayenneEntity1.java

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java?rev=398607&r1=398606&r2=398607&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/bridge/DataMapConverter.java Mon May  1 07:43:36 2006
@@ -17,6 +17,9 @@
 
 import java.beans.PropertyDescriptor;
 import java.lang.reflect.Field;
+import java.sql.Types;
+
+import javax.persistence.TemporalType;
 
 import org.apache.cayenne.jpa.JpaProviderException;
 import org.apache.cayenne.jpa.conf.EntityMapLoaderContext;
@@ -175,19 +178,35 @@
         @Override
         public boolean onStartNode(ProjectPath path) {
             JpaColumn jpaColumn = (JpaColumn) path.getObject();
+            JpaBasic jpaBasic = (JpaBasic) path.getObjectParent();
 
             ObjAttribute cayenneObjAttribute = (ObjAttribute) targetPath.getObject();
 
             DbAttribute dbAttribute = new DbAttribute(jpaColumn.getName());
 
-            // TODO, andrus, 4/28/2006 - per JPA spec, is there a way to override the type
-            // doing conversion implicitly???
-            dbAttribute.setType(TypesMapping.getSqlTypeByJava(cayenneObjAttribute
-                    .getJavaClass()));
+            // per JPA spec only date types are mapped explicitly...
+            int type;
+            TemporalType ttype = jpaBasic.getParent().getTemporal();
+            if (ttype != null) {
+
+                if (TemporalType.TIMESTAMP == ttype) {
+                    type = Types.TIMESTAMP;
+                }
+                else if (TemporalType.DATE == ttype) {
+                    type = Types.DATE;
+                }
+                else {
+                    type = Types.TIME;
+                }
+            }
+            else {
+                type = TypesMapping.getSqlTypeByJava(cayenneObjAttribute.getJavaClass());
+            }
+            dbAttribute.setType(type);
 
             dbAttribute.setMandatory(!jpaColumn.isNullable());
 
-            // TODO, andrus, 4/28/2006 - note that Cayenne DbAttribute's preceision is
+            // TODO, andrus, 4/28/2006 - note that Cayenne DbAttribute's precision is
             // really scale (and precision is not defined at all). Fix this in
             // DbAttribute.
             dbAttribute.setPrecision(jpaColumn.getScale());
@@ -219,16 +238,28 @@
 
             DbAttribute dbAttribute = new DbAttribute(jpaColumn.getName());
 
-            // TODO, andrus, 4/28/2006 - per JPA spec, is there a way to override the type
-            // doing conversion implicitly???
-
             JpaEntity jpaEntity = (JpaEntity) path.firstInstanceOf(JpaEntity.class);
             JpaId jpaId = (JpaId) path.firstInstanceOf(JpaId.class);
 
-            JpaPropertyDescriptor property = context.getLoadedDescriptor(
-                    jpaEntity.getClassName()).getProperty(jpaId.getName());
-
-            dbAttribute.setType(TypesMapping.getSqlTypeByJava(property.getType()));
+            // per JPA spec only date types are mapped explicitly...
+            int type;
+            if (jpaId.getTemporal() != null) {
+                if (TemporalType.TIMESTAMP == jpaId.getTemporal()) {
+                    type = Types.TIMESTAMP;
+                }
+                else if (TemporalType.DATE == jpaId.getTemporal()) {
+                    type = Types.DATE;
+                }
+                else {
+                    type = Types.TIME;
+                }
+            }
+            else {
+                JpaPropertyDescriptor property = context.getLoadedDescriptor(
+                        jpaEntity.getClassName()).getProperty(jpaId.getName());
+                type = TypesMapping.getSqlTypeByJava(property.getType());
+            }
+            dbAttribute.setType(type);
 
             dbAttribute.setMandatory(true);
             dbAttribute.setPrimaryKey(true);
@@ -319,6 +350,8 @@
                         + relationship.getTargetEntityName());
                 return false;
             }
+
+            cayenneRelationship.setTargetEntityName(jpaTargetEntity.getName());
 
             DbEntity cayenneSrcDbEntity = cayenneSrcEntity.getDbEntity();
 

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessor.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessor.java?rev=398607&r1=398606&r2=398607&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessor.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessor.java Mon May  1 07:43:36 2006
@@ -15,6 +15,10 @@
  */
 package org.apache.cayenne.jpa.conf;
 
+import java.util.Date;
+
+import javax.persistence.TemporalType;
+
 import org.apache.cayenne.jpa.JpaProviderException;
 import org.apache.cayenne.jpa.map.AccessType;
 import org.apache.cayenne.jpa.map.JpaAttribute;
@@ -113,14 +117,15 @@
             }
 
             JpaEntityMap root = (JpaEntityMap) path.getRoot();
-            if (root.getAccess() == AccessType.FIELD) {
-                for (JpaPropertyDescriptor candidate : descriptor.getFieldDescriptors()) {
+            if (root.getAccess() == AccessType.PROPERTY) {
+                for (JpaPropertyDescriptor candidate : descriptor
+                        .getPropertyDescriptors()) {
                     processProperty(entity, descriptor, candidate);
                 }
             }
+            // field is default...
             else {
-                for (JpaPropertyDescriptor candidate : descriptor
-                        .getPropertyDescriptors()) {
+                for (JpaPropertyDescriptor candidate : descriptor.getFieldDescriptors()) {
                     processProperty(entity, descriptor, candidate);
                 }
             }
@@ -181,6 +186,19 @@
                 JpaColumn column = new JpaColumn(AnnotationPrototypes.getColumn());
                 column.setName(jpaBasic.getParent().getName());
                 jpaBasic.setColumn(column);
+            }
+
+            if (jpaBasic.getParent().getTemporal() == null) {
+                JpaEntity entity = (JpaEntity) path.firstInstanceOf(JpaEntity.class);
+                JpaClassDescriptor descriptor = context.getLoadedDescriptor(entity
+                        .getClassName());
+                JpaPropertyDescriptor property = descriptor.getProperty(jpaBasic
+                        .getParent()
+                        .getName());
+
+                if (Date.class.equals(property.getType())) {
+                    jpaBasic.getParent().setTemporal(TemporalType.TIMESTAMP);
+                }
             }
 
             return true;

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/map/JpaAttribute.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/map/JpaAttribute.java?rev=398607&r1=398606&r2=398607&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/map/JpaAttribute.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/map/JpaAttribute.java Mon May  1 07:43:36 2006
@@ -42,7 +42,7 @@
     protected BasicSemantics basicSemantics;
     protected JpaColumn column;
     protected TemporalType temporal;
-    protected EnumType enumerated = EnumType.ORDINAL;
+    protected EnumType enumerated;
     protected String mapKey;
     protected String orderBy;
     protected boolean lob;

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/map/JpaId.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/map/JpaId.java?rev=398607&r1=398606&r2=398607&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/map/JpaId.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/main/java/org/apache/cayenne/jpa/map/JpaId.java Mon May  1 07:43:36 2006
@@ -24,7 +24,7 @@
     protected String name;
     protected JpaColumn column;
     protected JpaGeneratedValue generatedValue;
-    protected TemporalType temporal = TemporalType.TIMESTAMP;
+    protected TemporalType temporal;
 
     @TreeNodeChild
     public JpaColumn getColumn() {

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapMappingAssertion.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapMappingAssertion.java?rev=398607&r1=398606&r2=398607&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapMappingAssertion.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/bridge/DataMapMappingAssertion.java Mon May  1 07:43:36 2006
@@ -16,6 +16,7 @@
 package org.apache.cayenne.jpa.bridge;
 
 import java.sql.Types;
+import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
 
@@ -81,6 +82,10 @@
                 "Invalid SQL type: " + TypesMapping.getSqlNameByType(pk.getType()),
                 Types.INTEGER,
                 pk.getType());
+
+        DbAttribute column9 = (DbAttribute) table.getAttribute("column9");
+        assertNotNull(column9);
+        assertEquals(Types.DATE, column9.getType());
     }
 
     protected void assertObjAttributes(ObjEntity entity1) {
@@ -102,7 +107,7 @@
         assertNotNull(a3);
         assertEquals("attribute9", a3.getName());
         assertEquals("column9", a3.getDbAttributeName());
-        assertEquals(Integer.TYPE.getName(), a3.getType());
+        assertEquals(Date.class.getName(), a3.getType());
     }
 
     protected void assertObjRelationships(ObjEntity entity1) {
@@ -113,5 +118,6 @@
         assertNotNull(attribute5);
         assertFalse(attribute5.isToMany());
         assertEquals("attribute5", attribute5.getDbRelationshipPath());
+        assertEquals("MockCayenneTargetEntity2", attribute5.getTargetEntityName());
     }
 }

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java?rev=398607&r1=398606&r2=398607&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/EntityMapDefaultsProcessorTest.java Mon May  1 07:43:36 2006
@@ -17,6 +17,8 @@
 
 import java.io.Serializable;
 
+import javax.persistence.TemporalType;
+
 import junit.framework.TestCase;
 
 import org.apache.cayenne.jpa.map.JpaAttribute;
@@ -99,5 +101,12 @@
         assertEquals("pk", id.getName());
         assertNotNull(id.getColumn());
         assertEquals("pk", id.getColumn().getName());
+    }
+
+    public void testDate() throws Exception {
+        assertTrue(context.getConflicts().getFailures(
+                MockAnnotatedBean3.class.getDeclaredField("date")).isEmpty());
+        JpaAttribute date = entity.attributeForName("date");
+        assertEquals(TemporalType.TIMESTAMP, date.getTemporal());
     }
 }

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/MockAnnotatedBean3.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/MockAnnotatedBean3.java?rev=398607&r1=398606&r2=398607&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/MockAnnotatedBean3.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/conf/MockAnnotatedBean3.java Mon May  1 07:43:36 2006
@@ -16,6 +16,7 @@
 package org.apache.cayenne.jpa.conf;
 
 import java.util.Collection;
+import java.util.Date;
 
 import javax.persistence.Basic;
 import javax.persistence.Entity;
@@ -44,4 +45,7 @@
     @OneToMany
     // no collection type - must result in a failure
     protected Collection toBean2s2;
+    
+    // date w/o Temporal annotation must resolve to TIMESTAMP
+    protected Date date;
 }

Modified: incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/entity/cayenne/MockCayenneEntity1.java
URL: http://svn.apache.org/viewcvs/incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/entity/cayenne/MockCayenneEntity1.java?rev=398607&r1=398606&r2=398607&view=diff
==============================================================================
--- incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/entity/cayenne/MockCayenneEntity1.java (original)
+++ incubator/cayenne/jpa/trunk/cayenne-jpa/src/test/java/org/apache/cayenne/jpa/entity/cayenne/MockCayenneEntity1.java Mon May  1 07:43:36 2006
@@ -15,6 +15,8 @@
  */
 package org.apache.cayenne.jpa.entity.cayenne;
 
+import java.util.Date;
+
 import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -29,6 +31,8 @@
 import javax.persistence.OneToOne;
 import javax.persistence.QueryHint;
 import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
 import javax.persistence.Transient;
 import javax.persistence.Version;
 
@@ -78,5 +82,6 @@
     protected int attribute8;
 
     @Column(name = "column9")
-    protected int attribute9;
+    @Temporal(TemporalType.DATE)
+    protected Date attribute9;
 }