Nevermind. I had the second Object pointing to a view and in that view, I forgot that even if I set the column type to VARCHAR, the select behind the view was fetching from columns of type CHAR. That resulted in my primary key being filled with spaces.

Interesting though, if I map an object to a table with CHAR columns (all our legacy tables have that!) I can still define the column type in the Cayenne modeller to be VARCHAR and that works! I had that too on the view but it didn't do the trick.

Why is that so?

/Andreas Pardeike

On 18 mar 2008, at 14.55, Andreas Pardeike wrote:

Hi,

maybe I am totally off here, but I just tried to find out why my to- one relationship did not work and I went and traced the code for 3.0M3. Seems something is wrong in [EMAIL PROTECTED]:

This is my version and to me this looks like 'objects[0]' is never really used (see marker ? >>>>). As a result, 'object.getPersistenceState()' will of course still be PersistenceState.HOLLOW and the FaultFailureException is thrown.

Regards,
Andreas Pardeike



public void prepareForAccess(Persistent object, String property, boolean lazyFaulting) {
      if (object.getPersistenceState() == PersistenceState.HOLLOW) {

          ObjectId oid = object.getObjectId();
List<?> objects = performQuery(new ObjectIdQuery(oid, false, ObjectIdQuery.CACHE));

          if (objects.size() == 0) {
              throw new FaultFailureException(
"Error resolving fault, no matching row exists in the database for ObjectId: "
                              + oid);
          }
          else if (objects.size() > 1) {
              throw new FaultFailureException(
"Error resolving fault, more than one row exists in the database for ObjectId: "
                              + oid);
          }
? >>>>
          // sanity check...
if (object.getPersistenceState() != PersistenceState.COMMITTED) {

String state = PersistenceState.persistenceStateName(object
                      .getPersistenceState());

// TODO: andrus 4/13/2006, modified and deleted states are possible due to
              // a race condition, should we handle them here?

              throw new FaultFailureException(
                      "Error resolving fault for ObjectId: "
                              + oid
                              + " and state ("
                              + state
+ "). Possible cause - matching row is missing from the database.");
          }
      }

      // resolve relationship fault
      if (lazyFaulting && property != null) {
Property propertyDescriptor = getEntityResolver().getClassDescriptor( object.getObjectId().getEntityName()).getProperty(property);

          // this should trigger fault resolving
          propertyDescriptor.readProperty(object);
      }
  }

Reply via email to