public Object getAttribute(String fieldName) throws RemoteException
  {
    if (!isInitialized())
      throw new RemoteException("object not initialized.");

		if (fieldName == null)
			return null;

    Object o = properties.get(fieldName);
    if (o == null)
    {
    	// Mhh, wir haben keinen Wert hierfuer.
    	// Aber vielleicht ist es ja der Primary-Key
    	if (fieldName.equalsIgnoreCase(getIDField()))
    		return getID();

      return null;
    }

    // "o" kann auch vom Typ DBObject sein. Dann ist es schon ein aufgeloester Fremdschluessel
    if (o instanceof DBObject)
      return o;

    // wir checken, ob es sich um ein Objekt aus einer Fremdtabelle
    // handelt. Wenn das der Fall ist, liefern wir das statt der
    // lokalen ID aus.
    Class foreign = getForeignObject(fieldName);
    if (foreign != null)
    {
      String id = o.toString();
      
      DBObject cachedObject = (DBObject) foreignObjectCache.get(foreign.getName() + fieldName);
      if (cachedObject != null)
      {
        // Wir haben das Objekt im Cache
        // Wenn sich die ID geaendert hat, dann neu laden
        if (!id.equals(cachedObject.getID()))
          cachedObject.load(id);
      }
      else
      {
        // Haben wir noch nicht im Cache - neu laden und cachen
        cachedObject = service.createObject(foreign,id);
  			foreignObjectCache.put(foreign.getName() + fieldName,cachedObject);
      }
			return cachedObject;
    }

    return o;
  }