Re: [JIRA] Commented: (CAY-938) Map key not saved by modeler.

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Tue Dec 11 2007 - 09:11:42 EST

  • Next message: Kevin Menard (JIRA): "[JIRA] Closed: (CAY-936) Update Velocity templates for generics."

    Only in case of "null" key of course, as otherwise you can determine
    the type of the key at generation type by looking at the ObjAttribute.
    Also we can handle a sub-case of the "null" key - multi-column PK. In
    this case the key is always ObjectId.

    So we have these three cases:

    1. Relationship key maps to an ObjAttribute -> we should use
    ObjAttribute Java type for key declaration.
    2. Relationship key is null, and DbEntity has a single column PK -> we
    have no choice but to use java.lang.Object for key declaration.
    3. Relationship key is null, and DbEntity has a multi-column PK -> we
    should use ObjectId for key declaration.

    Andrus

    On Dec 11, 2007, at 3:59 PM, Kevin Menard wrote:
    > Alright. Then this won't be as clean as I was hoping for. I had
    > added a
    > helper method to EntityUtils that would figure out the type of the
    > map's key
    > based on the attribute. But, if it can vary based on context, I'll
    > just
    > have to have the template use Object.
    >
    > --
    > Kevin
    >
    >
    > On 12/11/07 8:25 AM, "Andrus Adamchik" <andru..bjectstyle.org> wrote:
    >
    >>
    >> On Dec 11, 2007, at 3:05 PM, Kevin Menard (JIRA) wrote:
    >>
    >>> However, when using the default key, calling
    >>> ObjRelationship#getMapKey() returns null. Is that expected behavior
    >>> as well? If so, I think I'd like to see that changed. I'm fine
    >>> with defaults not being specified in the DataMap, but the runtime
    >>> model should have all the info.
    >>
    >> Yes this is expected behavior. What NULL means is simply that there
    >> is
    >> no ObjAttribute for the key. Since id's in Cayenne are not class
    >> properties by default, there's nothing to map to. Here is the logic
    >> to
    >> extract the key in runtime:
    >>
    >> IdMapKeyAccessor.java:
    >>
    >> ObjectId id = ((Persistent) object).getObjectId();
    >>
    >> if (id.isTemporary()) {
    >> return id;
    >> }
    >>
    >> Map map = id.getIdSnapshot();
    >> if (map.size() == 1) {
    >> Map.Entry pkEntry = (Map.Entry)
    >> map.entrySet().iterator().next();
    >> return pkEntry.getValue();
    >> }
    >>
    >> return id;
    >>
    >> So you see, there is a bit of fuzziness - a key can be an ObjectId
    >> for
    >> multi-column PK and for NEW objects, or it can be a single PK value
    >> for committed single-column PK.
    >>
    >> Andrus



    This archive was generated by hypermail 2.0.0 : Tue Dec 11 2007 - 09:12:17 EST