Accessing PK and FK values of DataObjects

From: Andrus Adamchik (andru..bjectstyle.org)
Date: Fri Nov 28 2003 - 02:52:26 EST

  • Next message: André Luiz do Nascimento Sousa: "Not updating values of FK columns"

    This is probably the most frequently asked question on this list. So I
    figured it is time to write the docs for it. Here is an unformatted
    version of this page. It will be included in 1.0.4 release docs.

    Andrus

    Normally it is not advisable to map primary and foreign key columns (PK
    and FK) as Java class properties (ObjAttributes). When reverse
    engineering of the database is done using CayenneModeler, produced
    mapping will reflect that - PKs and FKs will not be included in the
    Java class. However sometimes the application requires access to these
    values. Cayenne provides an easy way to do that by creating custom get*
    methods in the DataObject subclass. Lets take a Painting class as an
    example. The following code is generated by CayenneModeler:

    package org.objectstyle.art;

    public class Painting extends org.objectstyle.art.auto._Painting {

    }

    package org.objectstyle.art.auto;

    /** Class _Painting was generated by Cayenne.
       * It is probably a good idea to avoid changing this class manually,
       * since it may be overwritten next time code is regenerated.
       * If you need to make any customizations, please use subclass.
       */
    public class _Painting extends org.objectstyle.art.ArtDataObject {

         public static final String ESTIMATED_PRICE_PROPERTY =
    "estimatedPrice";
         public static final String PAINTING_TITLE_PROPERTY =
    "paintingTitle";
         public static final String TO_ARTIST_PROPERTY = "toArtist";
         public static final String TO_GALLERY_PROPERTY = "toGallery";
         public static final String TO_PAINTING_INFO_PROPERTY =
    "toPaintingInfo";

         public static final String PAINTING_ID_PK_COLUMN = "PAINTING_ID";

         public void setEstimatedPrice(java.math.BigDecimal estimatedPrice) {
             writeProperty("estimatedPrice", estimatedPrice);
         }
         public java.math.BigDecimal getEstimatedPrice() {
             return (java.math.BigDecimal)readProperty("estimatedPrice");
         }

         public void setPaintingTitle(String paintingTitle) {
             writeProperty("paintingTitle", paintingTitle);
         }
         public String getPaintingTitle() {
             return (String)readProperty("paintingTitle");
         }
    ...
    }

    The following custom methods should be added to the Painting class to
    access the value of ARTIST_ID and PAINTING_ID:
      Note:
    If you perform class generation using Ant, you can customize class
    generation templates to generte these methods for you. Eventually
    CayenneModeler will support this too as optional functionality.

    package org.objectstyle.art;

    public class Painting extends org.objectstyle.art.auto._Painting {
        /** Read-only access to PK */
        public Integer getPaintingId() {
           return (getObjectId() != null && !getObjectId().isTemporary())
                    ?
    (Integer)getObjectId().getIdSnapshot().get(PAINTING_ID_PK_COLUMN)
                    : null;
        }

        /** Read-only access to FK */
        public Integer getArtistId() {
           Artist artist = getArtist();
           return (artist != null)
                    ?
    (Integer)artist.getObjectId().getIdSnapshot().get(Artist.ARTIST_ID_PK_CO
    LUMN)
                    : null;
        }
    }



    This archive was generated by hypermail 2.0.0 : Fri Nov 28 2003 - 02:52:30 EST