Yea, the reason I like to have the to-many in the model but not as a class property is so that I can do this.....

-------------------------
User model
-------------------------
public void validateForDelete() throws NSValidation.ValidationException {
    super.validateForDelete();

    // Deny delete rule for driverLogs relationship
if (Utilities.countRelatedEnterpriseObjects(this, "driverLogs").intValue() > 0) { throw new NSValidation.ValidationException("Delete was denied! This user has related driver logs. Disable login instead.");
    }
}

-------------------------
Utility class
-------------------------

/**
* Convenience method that returns the count of related records using raw SQL
 */
public static Number countRelatedEnterpriseObjects(EOEnterpriseObject sourceEO, String relationshipKey) {
    // First make sure the relationship is to-many and has unary keys
EOEntity sourceEntity = EOModelGroup.defaultGroup ().entityForObject(sourceEO);
    String modelName = sourceEntity.model().name();
EORelationship rel = sourceEntity.relationshipNamed (relationshipKey);
    NSArray destAttributes = rel.destinationAttributes();
    if (rel == null || !rel.isToMany()) {
throw new RuntimeException("No to-many relationship found for key: " + relationshipKey);
    }
    if (destAttributes.count() != 1) {
throw new RuntimeException("This method can only be used with entities having unary primary keys.");
    }
        
    //--------------------------------------------------
    // Count the number of related rows using raw SQL
    //--------------------------------------------------
    EOEntity destEntity = rel.destinationEntity();
    NSArray destPKAttributes = destEntity.primaryKeyAttributes();
String destPK = ((EOAttribute)destPKAttributes.lastObject ()).columnName(); String destFK = ((EOAttribute)destAttributes.lastObject ()).columnName();
        
    // Build the SQL statement to return the row count
String sql = "SELECT COUNT(" + destPK + ") FROM " + destEntity.externalName() + " WHERE " + destFK + " = " + unaryPKValueForObject(sourceEO) + ";"; NSArray rows = EOUtilities.rawRowsForSQL(sourceEO.editingContext (), modelName, sql, new NSArray("rowCount"));
    if (rows.count() > 0) {
Number rowCount = (Number)((NSDictionary)rows.lastObject ()).objectForKey("rowCount");
        return rowCount;
    }
    return null;
}

/**
 * Returns the PK of the object as a string value.
 */
public static String unaryPKValueForObject(EOEnterpriseObject eo){
NSDictionary d = EOUtilities.primaryKeyForObject (eo.editingContext(), eo);
    Number n = (Number)d.objectForKey("oid");
    return n.toString();
}


On Feb 6, 2008, at 1:56 PM, David Avendasora wrote:

I agree with this completely. WO will load ALL the to-many-related objects from the database when you try to set the inverse to-one relationship on a new object, which when there are thousands of related objects, this can cause a huge delay, especially in Java Client applications where the client then requests all the objects be sent to the client from the server. Ouch.

I have always just not modeled the inverse, unless I discovered a compelling reason to _expect_ all the related objects to be in memory. I didn't realize that if the relationship isn't marked as a class attribute that it wouldn't fetch them. That is interesting and would make the model much more intuitive.

Using a FetchSpec to go get the to-many-related objects manually has worked well for me as it only incurs the often substantial overhead if and when I explicitly ask it to.

Dave


On Feb 6, 2008, at 11:32 AM, Robert Walker wrote:

At least if using standard EOF classes, having the reverse to-many relationship as a class properly on the EO can cause very major performance problems because the to-many fault can get fired when you don't expect it. This can happen even if you never directly access the to-many relationship. I've had nightmares about this very problem in the past. I now consider the implication of adding the to-many side as a class property. If I expect it could return more than a few hundred objects then I don't use it. I still model the to-many side, I just don't set it as a class property. It's entirely possible that Project WOnder classes take care of this problem. I just wanted to make sure you were aware of it.



--
Robert Walker
[EMAIL PROTECTED]



 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to