Re: Factory method subclassing cayenne data objects

From: Michael Gentry (mgentr..asslight.net)
Date: Fri Mar 13 2009 - 10:33:08 EDT

  • Next message: han..elinux.cl: "Re: Factory method subclassing cayenne data objects"

    That doesn't sound right to me ... I'm pretty sure you can use an
    integer and I also believe you can use an enum, too. I vaguely recall
    testing that at one point.

    On Fri, Mar 13, 2009 at 9:59 AM, <han..elinux.cl> wrote:
    > List,
    >
    > I'm answering myself, but may be of help to somebody.
    >
    > Finally i have found the problem: The Qualifier (or Discriminator) has to be of type character and not Integer.
    >
    > ...my first intent was to use integer in order to follow our local policies for enumerations.
    >
    > Hans
    >
    >
    > ----- han..elinux.cl escribió:
    >
    >> Dave,
    >>
    >> I've implemented the inheritance as the tutorial say, it worked fine,
    >> but the factory method still need to get the initial artist class to
    >> know the type, then ask cayenne again to give the right class to
    >> instantiate.
    >>
    >> I think there may be another way to get the object without doing this
    >> double call to objectForPK.
    >>
    >>       public static Artist getArtist(String id) {
    >>
    >>               if (id == null || id.equals(""))
    >>                       return null;
    >>
    >>               DataContext context = DataContext.getThreadDataContext();
    >>
    >>               Artist c = (Artist) DataObjectUtils.objectForPK(context,
    >>                               Artist.class, Integer.parseInt(id));
    >>
    >>               if (c.getTipoEnum() == EnumTipoArtist.EXPERT)
    >>                       return (Artist) DataObjectUtils.objectForPK(context,
    >>                                       ExpertArtist.class, Integer.parseInt(id));
    >>               else
    >>                       return c;
    >>       }
    >>
    >> Thanks
    >> Hans
    >>
    >> ----- "Dave Lamy" <davelam..mail.com> escribió:
    >>
    >> > Hey Hans--
    >> >
    >> > While I'm certain that the inheritance structure isn't data based
    >> to
    >> > you, I
    >> > imagine that Cayenne is going to HAVE to have a data value to know
    >> > which
    >> > subclass to instantiate.  It's effectively going to get back a row
    >> > from the
    >> > Artist table and be asked to transform that row into an Artist
    >> object.
    >> >  How
    >> > can it determine which kind?  Through some sort of data analysis.
    >> > Either a
    >> > particular attribute value (ARTIST_TYPE) or via a linked table
    >> > structure
    >> > (don't think Cayenne supports that yet?).  That data attribute
    >> should
    >> > not be
    >> > of particular importance to your application, however.  It's just
    >> an
    >> > ORM
    >> > crutch.
    >> >
    >> > Dave
    >> >
    >> > On Mon, Mar 2, 2009 at 8:41 AM, <han..elinux.cl> wrote:
    >> >
    >> > > Michael,
    >> > >
    >> > > Thank you, i already saw it, but my intent was to make it
    >> entirely
    >> > outside
    >> > > cayenne mappings, the problem i need to solve is just behavioral,
    >> > not data
    >> > > based... by the way, it's not clear how to try the example using
    >> > the
    >> > > modeler: creating an empty class with no attributes or something.
    >> > >
    >> > > Hans
    >> > >
    >> > > ----- "Michael Gentry" <mgentr..asslight.net> escribió:
    >> > >
    >> > > > Is this what you are after?
    >> > > >
    >> > > > http://cayenne.apache.org/doc/handling-inheritance.html
    >> > > >
    >> > > >
    >> > > > On Sun, Mar 1, 2009 at 7:46 PM,  <han..elinux.cl> wrote:
    >> > > > > Hi,
    >> > > > >
    >> > > > > I'm trying to implement a factory method pattern based on a
    >> > cayenne
    >> > > > data object.
    >> > > > >
    >> > > > > Say for example i have a class (cayenne based) called Artist,
    >> i
    >> > want
    >> > > > to make a subclass of Artist, say ExpertArtist that implements
    >> > some
    >> > > > specific behavior.
    >> > > > >
    >> > > > > Actually i have a big static Factory class that give me the
    >> all
    >> > > > objects, i have a method like this:
    >> > > > >
    >> > > > >         public static Artist getArtist(String id) {
    >> > > > >
    >> > > > >                 if (id == null || id.equals(""))
    >> > > > >                         return null;
    >> > > > >
    >> > > > >                 DataContext context =
    >> > > > DataContext.getThreadDataContext();
    >> > > > >
    >> > > > >                 Artist object = (Artist)
    >> > > > DataObjectUtils.objectForPK(
    >> > > > >                                 context, Artist.class,
    >> > > > Integer.parseInt(id));
    >> > > > >                 return object;
    >> > > > >         }
    >> > > > >
    >> > > > > Obviously i can declare ExpertArtist as an subclass of
    >> Artist.
    >> > > > >
    >> > > > > package xxx.xxx;
    >> > > > >
    >> > > > > public class EspertArtist extends Artist {
    >> > > > >    public String getName() {
    >> > > > >        return super.getName() + " i'am expert !!";
    >> > > > >    }
    >> > > > > }
    >> > > > >
    >> > > > > I've tried to instantiate an ExpertArtist, just modifying the
    >> > > > Factory method, with no results. I don't know how to bouild the
    >> > parent
    >> > > > class calling super or something...
    >> > > > >
    >> > > > > Obviously these are not the real classes, the actual classes
    >> > are
    >> > > > really big and this solution: just modifying the factory method
    >> is
    >> > the
    >> > > > best for me.
    >> > > > >
    >> > > > >
    >> > > > > Thanks
    >> > > > > Hans
    >> > > > >
    >> > > > >
    >> > > > >
    >> > >
    >> > > --
    >> > > Hans Poo, WeLinux S.A.
    >> > > Oficina: 697.25.42, Celular: 09-319.93.05
    >> > > Bombero Ossa # 1010, Santiago
    >> > >
    >> > >
    >>
    >> --
    >> Hans Poo, WeLinux S.A.
    >> Oficina: 697.25.42, Celular: 09-319.93.05
    >> Bombero Ossa # 1010, Santiago
    >
    > --
    > Hans Poo, WeLinux S.A.
    > Oficina: 697.25.42, Celular: 09-319.93.05
    > Bombero Ossa # 1010, Santiago
    >
    >



    This archive was generated by hypermail 2.0.0 : Fri Mar 13 2009 - 10:33:45 EDT