In the old days (1.1), a relationship to a table that didn't exist in
the current database and wasn't referenced explicitly by the java code
wasn't an issue. But after my upgrade to 1.2/2.0/3.0 ending at 3.1, I
noticed that cayenne would generate relationship queries for these
items even when they were not necessary.
For awhile, I was able to deal with this by explicitly checking for
known "bad" relationships by detecting them and returning null.
public Query willPerformQuery(DataContext dataContext, Query query) {
if (query instanceof RelationshipQuery) {
RelationshipQuery relationshipQuery = (RelationshipQuery)query;
if (we_know_the_relationships_are_not_used_by_this_deployment) {
if
("Account".equals(relationshipQuery.getObjectId().getEntityName())) {
if
("accountBadRelationshipNameForThisDeployment".equals(relationshipQuery.getRelationshipName()))
{
// do nothing
return null;
}
}
But then I started to hit them for relationships being internally
generated by Cayenne, which is even more frustrating as these are now
relationships not used by any of my code in any situation, and I can't
detect them and ignore them any more.
It seems rather odd to me that we are executing database queries
against relationships which the end-user doesn't even define as an
ObjRelationship.
I am probably going to just create a separate datamap for each
deployment type (there are currently only two) rather than fight this
any more. The timing is somewhat right as the application originally
ran at two divisions of the same company, and those have now split
into two separate companies and there is a desire to maintain the code
separately. But it still seems as if this is a problem that Cayenne
should not be creating and has performance and efficiency issues.
Ebpp DEBUG [btpool0-14 01-01 10:09:28]
RestrictingQualifierDataContextDelegate: in
RestrictingQualifierDataContextDelegate.willPerformQuery(DataContext,
Query)
Ebpp DEBUG [btpool0-14 01-01 10:09:28]
RestrictingQualifierDataContextDelegate:
relationshipQuery.getRelationshipName()=runtimeRelationship2
Ebpp DEBUG [btpool0-14 01-01 10:09:28]
RestrictingQualifierDataContextDelegate:
relationshipQuery.getObjectId().getEntityName()=Account
Ebpp INFO [btpool0-14 01-01 10:09:28] CommonsJdbcEventLogger: ---
transaction started.
Ebpp INFO [btpool0-14 01-01 10:09:28] CommonsJdbcEventLogger: SELECT
DISTINCT t0.ALTITUDE AS c0, t0.DOOR_HANGER_NUMBER AS c1,
t0.INVALIDATED AS c2, t0.INVALIDATED_DATE AS c3,
t0.IS_ADDED_TO_MAP_DATABASE AS c4, t0.LATITUDE AS c5, t0.LONGITUDE AS
c6, t0.ID AS c7, t0.SERVICE_ADDRESS_ID AS c8, t0.TAX_DISTRICT_ID AS c9
FROM PREMISE t0 JOIN ACCOUNT_THISTABLEDOESNOTEXIST t1 ON (t0.ID =
t1.PREMISE_ID) WHERE t1.ID = ? [bind: 1:58401]
Ebpp INFO [btpool0-14 01-01 10:09:28] CommonsJdbcEventLogger: *** error.
java.sql.SQLException: ORA-00942: table or view does not exist
[...]
at
org.apache.cayenne.access.jdbc.SelectAction.performAction(SelectAction.java:75)
at
org.apache.cayenne.access.DataNodeQueryAction.runQuery(DataNodeQueryAction.java:87)
at org.apache.cayenne.access.DataNode.performQueries(DataNode.java:280)
at
org.apache.cayenne.access.DataDomainQueryAction.runQuery(DataDomainQueryAction.java:442)
at
org.apache.cayenne.access.DataDomainQueryAction.access$000(DataDomainQueryAction.java:70)
at
org.apache.cayenne.access.DataDomainQueryAction$2.transform(DataDomainQueryAction.java:415)
at
org.apache.cayenne.access.DataDomain.runInTransaction(DataDomain.java:877)
at
org.apache.cayenne.access.DataDomainQueryAction.runQueryInTransaction(DataDomainQueryAction.java:412)
at
org.apache.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:122)
at
org.apache.cayenne.access.DataDomain.onQueryNoFilters(DataDomain.java:758)
at
org.apache.cayenne.access.DataDomain$DataDomainQueryFilterChain.onQuery(DataDomain.java:1009)
at org.apache.cayenne.access.DataDomain.onQuery(DataDomain.java:748)
at
org.apache.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:350)
at
org.apache.cayenne.util.ObjectContextQueryAction.executePostCache(ObjectContextQueryAction.java:106)
at
org.apache.cayenne.util.ObjectContextQueryAction.execute(ObjectContextQueryAction.java:93)
at org.apache.cayenne.access.DataContext.onQuery(DataContext.java:989)
at org.apache.cayenne.access.DataContext.performQuery(DataContext.java:978)
at org.apache.cayenne.access.ToOneFault.doResolveFault(ToOneFault.java:81)
at org.apache.cayenne.access.ToOneFault.resolveFault(ToOneFault.java:54)
at
org.apache.cayenne.CayenneDataObject.readProperty(CayenneDataObject.java:186)
at
org.apache.cayenne.reflect.generic.DataObjectBaseProperty.readProperty(DataObjectBaseProperty.java:43)
at org.apache.cayenne.access.ObjectDiff$1.visitToOne(ObjectDiff.java:106)
at
org.apache.cayenne.reflect.generic.DataObjectToOneProperty.visit(DataObjectToOneProperty.java:87)
at
org.apache.cayenne.reflect.PersistentDescriptor.visitProperties(PersistentDescriptor.java:411)
at
org.apache.cayenne.reflect.LazyClassDescriptorDecorator.visitProperties(LazyClassDescriptorDecorator.java:174)
at org.apache.cayenne.access.ObjectDiff.<init>(ObjectDiff.java:92)
at org.apache.cayenne.access.ObjectStore.registerDiff(ObjectStore.java:224)
at org.apache.cayenne.access.ObjectStore.arcCreated(ObjectStore.java:983)
at
org.apache.cayenne.util.ObjectContextGraphAction.handleArcPropertyChange(ObjectContextGraphAction.java:88)
at
org.apache.cayenne.util.ObjectContextGraphAction.handlePropertyChange(ObjectContextGraphAction.java:65)
at org.apache.cayenne.BaseContext.propertyChanged(BaseContext.java:477)
at
org.apache.cayenne.CayenneDataObject.addToManyTarget(CayenneDataObject.java:251)
at
org.apache.cayenne.CayenneDataObject.setReverseRelationship(CayenneDataObject.java:337)
at
org.apache.cayenne.CayenneDataObject.setToOneTarget(CayenneDataObject.java:288)
at
com.xyz.cayenne.ebpp.entity.generated._ScheduledPayment.setAccount(_ScheduledPayment.java:736)