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 2009/08/21 13:07:58 UTC
svn commit: r806496 - in
/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src:
main/java/org/apache/cayenne/access/ test/java/org/apache/cayenne/access/
test/java/org/apache/cayenne/testdo/inherit/
test/java/org/apache/cayenne/testdo/inherit/au...
Author: aadamchik
Date: Fri Aug 21 11:07:57 2009
New Revision: 806496
URL: http://svn.apache.org/viewvc?rev=806496&view=rev
Log:
CAY-132 Intelligent lazy fault detection
fixing a case when a relationship to a superclass is involved
adding test cases
Added:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/People.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/PersonNotes.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_People.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_PersonNotes.java
Modified:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/InheritanceTest.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/AbstractPerson.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_AbstractPerson.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/people.map.xml
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java?rev=806496&r1=806495&r2=806496&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java Fri Aug 21 11:07:57 2009
@@ -38,6 +38,7 @@
import org.apache.cayenne.map.DataMap;
import org.apache.cayenne.map.DbRelationship;
import org.apache.cayenne.map.LifecycleEvent;
+import org.apache.cayenne.map.ObjEntity;
import org.apache.cayenne.map.ObjRelationship;
import org.apache.cayenne.query.EntityResultSegment;
import org.apache.cayenne.query.ObjectIdQuery;
@@ -219,13 +220,20 @@
// create a fault
if (context != null && !relationship.isOptional()) {
- // prevent passing partial snapshots to ObjectResolver per CAY-724. Create
- // a hollow object right here and skip object conversion downstream
- this.noObjectConversion = true;
- Object object = context.localObject(targetId, null);
+ // final check (how do we do it in relationship.isOptional()??) - is
+ // inheritance involved
+ ObjEntity targetEntity = (ObjEntity) relationship.getTargetEntity();
+ if (domain.getEntityResolver().lookupInheritanceTree(targetEntity) == null) {
+
+ // prevent passing partial snapshots to ObjectResolver per CAY-724.
+ // Create
+ // a hollow object right here and skip object conversion downstream
+ this.noObjectConversion = true;
+ Object object = context.localObject(targetId, null);
- this.response = new GenericResponse(Collections.singletonList(object));
- return DONE;
+ this.response = new GenericResponse(Collections.singletonList(object));
+ return DONE;
+ }
}
}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/InheritanceTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/InheritanceTest.java?rev=806496&r1=806495&r2=806496&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/InheritanceTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/InheritanceTest.java Fri Aug 21 11:07:57 2009
@@ -23,6 +23,8 @@
import java.util.List;
import org.apache.cayenne.DataObjectUtils;
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.query.SQLTemplate;
import org.apache.cayenne.query.SelectQuery;
import org.apache.cayenne.testdo.inherit.AbstractPerson;
import org.apache.cayenne.testdo.inherit.Address;
@@ -32,13 +34,13 @@
import org.apache.cayenne.testdo.inherit.Department;
import org.apache.cayenne.testdo.inherit.Employee;
import org.apache.cayenne.testdo.inherit.Manager;
+import org.apache.cayenne.testdo.inherit.PersonNotes;
import org.apache.cayenne.testdo.inherit.RelatedEntity;
import org.apache.cayenne.testdo.inherit.SubEntity;
import org.apache.cayenne.unit.PeopleCase;
/**
* Testing Cayenne behavior with DataObject inheritance hierarchies.
- *
*/
public class InheritanceTest extends PeopleCase {
@@ -51,6 +53,23 @@
context = createDataContext();
}
+ public void testRelationshipToAbstractSuper() {
+ context
+ .performGenericQuery(new SQLTemplate(
+ AbstractPerson.class,
+ "INSERT INTO PERSON (PERSON_ID, NAME, PERSON_TYPE) VALUES (1, 'AA', 'EE')"));
+
+ context.performGenericQuery(new SQLTemplate(
+ PersonNotes.class,
+ "INSERT INTO PERSON_NOTES (ID, NOTES, PERSON_ID) VALUES (1, 'AA', 1)"));
+
+ PersonNotes note = DataObjectUtils.objectForPK(context, PersonNotes.class, 1);
+ assertNotNull(note);
+ assertNotNull(note.getPerson());
+ assertTrue(note.getPerson() instanceof Employee);
+
+ }
+
public void testSave() throws Exception {
ClientCompany company = context.newObject(ClientCompany.class);
company.setName("Boeing");
@@ -201,7 +220,7 @@
// We should still just have the one mapped relationship, but we in fact now have
// two:
// DirectToSubEntity -> BaseEntity and DirectToSubEntity -> SubEntity.
-
+
// TODO: andrus 2008/03/28 - this fails...
// assertEquals(1, context.getEntityResolver().getObjEntity("DirectToSubEntity")
// .getRelationships().size());
@@ -213,8 +232,8 @@
//
// assertEquals(1, direct.getSubEntities().size());
//
- // context.deleteObject(sub);
- // assertEquals(0, direct.getSubEntities().size());
+ // context.deleteObject(sub);
+ // assertEquals(0, direct.getSubEntities().size());
}
/**
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/AbstractPerson.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/AbstractPerson.java?rev=806496&r1=806495&r2=806496&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/AbstractPerson.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/AbstractPerson.java Fri Aug 21 11:07:57 2009
@@ -18,7 +18,7 @@
****************************************************************/
package org.apache.cayenne.testdo.inherit;
-public class AbstractPerson extends org.apache.cayenne.testdo.inherit.auto._AbstractPerson {
+public abstract class AbstractPerson extends org.apache.cayenne.testdo.inherit.auto._AbstractPerson {
}
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/People.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/People.java?rev=806496&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/People.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/People.java Fri Aug 21 11:07:57 2009
@@ -0,0 +1,18 @@
+package org.apache.cayenne.testdo.inherit;
+
+import org.apache.cayenne.testdo.inherit.auto._People;
+
+public class People extends _People {
+
+ private static People instance;
+
+ private People() {}
+
+ public static People getInstance() {
+ if(instance == null) {
+ instance = new People();
+ }
+
+ return instance;
+ }
+}
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/PersonNotes.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/PersonNotes.java?rev=806496&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/PersonNotes.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/PersonNotes.java Fri Aug 21 11:07:57 2009
@@ -0,0 +1,7 @@
+package org.apache.cayenne.testdo.inherit;
+
+import org.apache.cayenne.testdo.inherit.auto._PersonNotes;
+
+public class PersonNotes extends _PersonNotes {
+
+}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_AbstractPerson.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_AbstractPerson.java?rev=806496&r1=806495&r2=806496&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_AbstractPerson.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_AbstractPerson.java Fri Aug 21 11:07:57 2009
@@ -1,6 +1,9 @@
package org.apache.cayenne.testdo.inherit.auto;
+import java.util.List;
+
import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.testdo.inherit.PersonNotes;
/**
* Class _AbstractPerson was generated by Cayenne.
@@ -12,6 +15,7 @@
public static final String NAME_PROPERTY = "name";
public static final String PERSON_TYPE_PROPERTY = "personType";
+ public static final String NOTES_PROPERTY = "notes";
public static final String PERSON_ID_PK_COLUMN = "PERSON_ID";
@@ -29,4 +33,16 @@
return (String)readProperty("personType");
}
+ public void addToNotes(PersonNotes obj) {
+ addToManyTarget("notes", obj, true);
+ }
+ public void removeFromNotes(PersonNotes obj) {
+ removeToManyTarget("notes", obj, true);
+ }
+ @SuppressWarnings("unchecked")
+ public List<PersonNotes> getNotes() {
+ return (List<PersonNotes>)readProperty("notes");
+ }
+
+
}
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_People.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_People.java?rev=806496&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_People.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_People.java Fri Aug 21 11:07:57 2009
@@ -0,0 +1,12 @@
+package org.apache.cayenne.testdo.inherit.auto;
+
+
+
+/**
+ * This class was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public class _People {
+}
\ No newline at end of file
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_PersonNotes.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_PersonNotes.java?rev=806496&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_PersonNotes.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/inherit/auto/_PersonNotes.java Fri Aug 21 11:07:57 2009
@@ -0,0 +1,35 @@
+package org.apache.cayenne.testdo.inherit.auto;
+
+import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.testdo.inherit.AbstractPerson;
+
+/**
+ * Class _PersonNotes was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public abstract class _PersonNotes extends CayenneDataObject {
+
+ public static final String NOTES_PROPERTY = "notes";
+ public static final String PERSON_PROPERTY = "person";
+
+ public static final String ID_PK_COLUMN = "ID";
+
+ public void setNotes(String notes) {
+ writeProperty("notes", notes);
+ }
+ public String getNotes() {
+ return (String)readProperty("notes");
+ }
+
+ public void setPerson(AbstractPerson person) {
+ setToOneTarget("person", person, true);
+ }
+
+ public AbstractPerson getPerson() {
+ return (AbstractPerson)readProperty("person");
+ }
+
+
+}
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/people.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/people.map.xml?rev=806496&r1=806495&r2=806496&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/people.map.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/people.map.xml Fri Aug 21 11:07:57 2009
@@ -36,10 +36,15 @@
<db-attribute name="PERSON_TYPE" type="CHAR" isMandatory="true" length="2"/>
<db-attribute name="SALARY" type="FLOAT"/>
</db-entity>
+ <db-entity name="PERSON_NOTES">
+ <db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
+ <db-attribute name="NOTES" type="VARCHAR" length="255"/>
+ <db-attribute name="PERSON_ID" type="INTEGER"/>
+ </db-entity>
<db-entity name="RELATED_ENTITY">
<db-attribute name="RELATED_ENTITY_ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
</db-entity>
- <obj-entity name="AbstractPerson" className="org.apache.cayenne.testdo.inherit.AbstractPerson" dbEntityName="PERSON">
+ <obj-entity name="AbstractPerson" abstract="true" className="org.apache.cayenne.testdo.inherit.AbstractPerson" dbEntityName="PERSON">
<obj-attribute name="name" type="java.lang.String" db-attribute-path="NAME"/>
<obj-attribute name="personType" type="java.lang.String" db-attribute-path="PERSON_TYPE"/>
</obj-entity>
@@ -70,6 +75,9 @@
<obj-entity name="Manager" superEntityName="Employee" className="org.apache.cayenne.testdo.inherit.Manager">
<qualifier><![CDATA[personType = "EM"]]></qualifier>
</obj-entity>
+ <obj-entity name="PersonNotes" className="org.apache.cayenne.testdo.inherit.PersonNotes" dbEntityName="PERSON_NOTES">
+ <obj-attribute name="notes" type="java.lang.String" db-attribute-path="NOTES"/>
+ </obj-entity>
<obj-entity name="RelatedEntity" className="org.apache.cayenne.testdo.inherit.RelatedEntity" dbEntityName="RELATED_ENTITY">
</obj-entity>
<obj-entity name="SubEntity" superEntityName="BaseEntity" className="org.apache.cayenne.testdo.inherit.SubEntity">
@@ -102,15 +110,22 @@
<db-relationship name="managedDepartments" source="PERSON" target="DEPARTMENT" toMany="true">
<db-attribute-pair source="PERSON_ID" target="MANAGER_ID"/>
</db-relationship>
+ <db-relationship name="notes" source="PERSON" target="PERSON_NOTES" toMany="true">
+ <db-attribute-pair source="PERSON_ID" target="PERSON_ID"/>
+ </db-relationship>
<db-relationship name="toClientCompany" source="PERSON" target="CLIENT_COMPANY" toMany="false">
<db-attribute-pair source="CLIENT_COMPANY_ID" target="CLIENT_COMPANY_ID"/>
</db-relationship>
<db-relationship name="toDepartment" source="PERSON" target="DEPARTMENT" toMany="false">
<db-attribute-pair source="DEPARTMENT_ID" target="DEPARTMENT_ID"/>
</db-relationship>
+ <db-relationship name="person" source="PERSON_NOTES" target="PERSON" toMany="false">
+ <db-attribute-pair source="PERSON_ID" target="PERSON_ID"/>
+ </db-relationship>
<db-relationship name="entities" source="RELATED_ENTITY" target="BASE_ENTITY" toMany="true">
<db-attribute-pair source="RELATED_ENTITY_ID" target="RELATED_ENTITY_ID"/>
</db-relationship>
+ <obj-relationship name="notes" source="AbstractPerson" target="PersonNotes" deleteRule="Nullify" db-relationship-path="notes"/>
<obj-relationship name="toEmployee" source="Address" target="Employee" db-relationship-path="toPerson"/>
<obj-relationship name="toDirectToSubEntity" source="BaseEntity" target="DirectToSubEntity" deleteRule="Nullify" db-relationship-path="directToSubEntities"/>
<obj-relationship name="toRelatedEntity" source="BaseEntity" target="RelatedEntity" deleteRule="Nullify" db-relationship-path="relatedEntities"/>
@@ -122,6 +137,7 @@
<obj-relationship name="addresses" source="Employee" target="Address" db-relationship-path="employeeAddresses"/>
<obj-relationship name="toDepartment" source="Employee" target="Department" db-relationship-path="toDepartment"/>
<obj-relationship name="managedDepartments" source="Manager" target="Department" db-relationship-path="managedDepartments"/>
+ <obj-relationship name="person" source="PersonNotes" target="AbstractPerson" deleteRule="Nullify" db-relationship-path="person"/>
<obj-relationship name="baseEntities" source="RelatedEntity" target="BaseEntity" db-relationship-path="entities"/>
<obj-relationship name="subEntities" source="RelatedEntity" target="SubEntity" db-relationship-path="entities"/>
</data-map>