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, <[email protected]> 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 > > > ----- [email protected] 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" <[email protected]> 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, <[email protected]> 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" <[email protected]> escribió: >> > > >> > > > Is this what you are after? >> > > > >> > > > http://cayenne.apache.org/doc/handling-inheritance.html >> > > > >> > > > >> > > > On Sun, Mar 1, 2009 at 7:46 PM, <[email protected]> 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 > >
