Hi Michael, I won't have time to make a reduced test case before early January. In the mean time I found a workaround so I can continue using Cayenne.
Thanks for you time 2011/12/15 Michael Gentry <mgen...@masslight.net>: > Hi Mathias, > > I think we might need to see more of your model to understand what is > going on. In the query you gave: > > SELECT t0.ID, t0.DESCRIPTION, t0.NAME, t0.TYPE, t1.PATH, t2.PASSWORD, > t3.VALUE FROM ELEMENT t0 JOIN FILE t1 ON (t0.ID = t1.ID) JOIN > PRINCIPAL t2 ON (t0.ID = t2.ID) JOIN PERMISSION t3 ON (t0.ID = t3.ID) > > I'm curious as to while FILE is listed there when you are retrieving > PRINCIPAL. I suspect you have something in the joins not quite right. > > Another option would be to do a smaller test case. Create a small > project with just the inheritance and use an H2 in-memory database to > test it. This is how I often explore a lot of things. H2 is great > for this kind of activity because it is small and vast and you don't > need a complicated setup (it is memory-only). If you try this, be > sure you use org.apache.cayenne.access.dbsync.CreateIfNoSchemaStrategy > on the DataNode to automatically create your schema for your test. > > mrg > > > On Tue, Dec 13, 2011 at 2:47 AM, Mathias Clerc <tlarhi...@gmail.com> wrote: >> 2011/12/13 Mathias Clerc <tlarhi...@gmail.com>: >>> Hi Michael, >>> >>> Hello >>> >>> Actually I am trying to use Cayenne vertical inheritance. Some more >>> details on what I did : >>> >>> I have followed the guide here : >>> http://cayenne.apache.org/doc30/modeling-vertical-inheritance.html >>> and with a lot of trial and error, I finally got it to insert data. >>> >>> Unfortunately I cannot make the select queries to work correctly. >>> After some searches I found that old thread with the same problem : >>> http://cayenne.195.n3.nabble.com/Vertical-inheritance-td827636i20.html >>> I tried the workaround from that thread but it didn't help. >>> >>> >>> In my DB, I have one root table called ELEMENT from which the tables >>> "FILE", "PRINCIPAL" and "PERMISSION" are inheriting. >>> If I create a new ELEMENT like this : >>> Element elem = context.newObject(Element.class); >>> elem.setName("test1"); >>> elem.setDescription("test1 description"); >>> elem.setType("ELEMENT"); >>> Or a PRINCIPAL like this : >>> Principal p = context.newObject(Principal.class); >>> p.setPassword("password"); >>> p.setName("principal1"); >>> p.setDescription("principal1 description"); >>> p.setType("PRINCIPAL"); >>> It inserts perfectly. >>> >>> If I then run through JDBC "SELECT t0.ID, t0.DESCRIPTION, t0.NAME FROM >>> ELEMENT t0", I get the values back. >>> >>> But if I make a simple select with Cayenne like : >>> context.performQuery(new SelectQuery(Element.class)); >>> >>> It does not return anything as it is trying to use the query : >>> SELECT t0.ID, t0.DESCRIPTION, t0.NAME, t0.TYPE, t1.PATH, t2.PASSWORD, >>> t3.VALUE FROM ELEMENT t0 JOIN FILE t1 ON (t0.ID = t1.ID) JOIN >>> PRINCIPAL t2 ON (t0.ID = t2.ID) JOIN PERMISSION t3 ON (t0.ID = t3.ID) >>> >>> The query is wrong as it is trying to join the parent table on all the >>> child tables at the same time. >>> "test1" is in no subtable and "principal1" is not in FILE or PERMISSION. >>> >>> I have put the map file content there : http://pastebin.com/KtVhDdYE >>> >>> >>> Do you have any idea on what to try next to get it to work ? >>> >>> 2011/12/13 Michael Gentry <mgen...@masslight.net>: >>>> Hi Mathias, >>>> >>>> I believe you are trying to use a currently unimplemented inheritance >>>> mechanism. Cayenne does not currently support horizontal >>>> (multiple-table) inheritance: >>>> >>>> http://cayenne.apache.org/doc/inheritance-overview.html >>>> >>>> There are tricks you can do to make working with multiple related >>>> tables easier (such as adding getters/setters in your subclass to >>>> reference the parent), but you cannot currently model this behavior >>>> automatically. >>>> >>>> mrg >>>> >>>> >>>> On Fri, Dec 9, 2011 at 3:00 AM, Mathias Clerc <tlarhi...@gmail.com> wrote: >>>>> Hello, >>>>> >>>>> It seems like I have missed something in inheritance in Cayenne. >>>>> >>>>> I have one main table called "Element" with fields id (PK), name and >>>>> description >>>>> Another table "File" inherits from "Element" with fields ID(PK, FK on >>>>> Element.id) and path. >>>>> >>>>> When I do a context.performIteratedQuery(new >>>>> SelectQuery(Element.class)) The query I see is : >>>>> SELECT t0.ID, t0.DESCRIPTION, t0.NAME, t0.TYPE, t0.ID, t0.ID, t0.PATH >>>>> FROM ELEMENT t0 >>>>> >>>>> I tried checking and unchecking the "To Dep PK" field for the relation in >>>>> ID. >>>>> >>>>> What did I miss ? >> >> If I replace my query by : >> String sql = "select * FROM ELEMENT"; >> SQLTemplate select = new SQLTemplate(Element.class, sql); >> >> List<?> result = context.performQuery(select); >> >> Then it works perfectly well. When an element with type="FILE" is >> found it returns a File instance, when an element with >> type="PRINCIPAL" is found it returns a Principal instance. >> >> I guess I am missing some simple checkbox somewhere in the modeler.