FAQ
Hello Apache-Cayenne users,

I am engaged on a project where we are trying to replace a messy bespoke Data Access Layer with a more modern ORM framework. We have been looking at Hibernate but it cannot handle our inheritance model. I would like to ask if Cayenne can handle such a model because if it can we will continue and make a full assessmet of Cayenne. I will describe the model to you now:

Ok the database tables look like this:

BASEENTITY
-ID
-LINKID

TRADE
-ID

INSTR
-ID

And the Java object hierarchy is that BaseEntity is the superclass with Trade and Instr (and others) as the subclass.

Here's the rub...

The ID fields on the 3 tables do NOT express a hierarchy. They are unique to each table only. You cannot look up a Trade's BaseEntity by using the trade ID and finding a matching LINKID in BaseEntity.

The connection is actually the BASEENTITY.LINKID field. The LINKID matches IDs in the TRADE or INSTR table. Like this:

BASEENTITY
ID=1, LINKID=100
ID=2, LINKID=200

TRADE
ID=100

INSTR
ID=200

Hibernate cannot handle this. Unidirectional one to one relationships require annotation on each end. The 'table per class' inheritance model requires the ID fields in TRADE and INSTR to be foreign keys of BASEENTITY, which they are not.

Look forward to any advice.
Thanks,
John

Search Discussions

  • Robert Zeigler at Apr 1, 2010 at 4:05 pm
    How do you ensure that you don't wind up with duplicated LINKID values? Eg,
    if TRADE.ID assigned based on the value of LINKID, or is LINKID assigned
    based on the value of TRADE.ID and/or INSTR.ID?

    Robert
    On Thu, Apr 1, 2010 at 10:49 AM, Summers, John1 wrote:

    Hello Apache-Cayenne users,

    I am engaged on a project where we are trying to replace a messy bespoke
    Data Access Layer with a more modern ORM framework. We have been looking at
    Hibernate but it cannot handle our inheritance model. I would like to ask if
    Cayenne can handle such a model because if it can we will continue and make
    a full assessmet of Cayenne. I will describe the model to you now:

    Ok the database tables look like this:

    BASEENTITY
    -ID
    -LINKID

    TRADE
    -ID

    INSTR
    -ID

    And the Java object hierarchy is that BaseEntity is the superclass with
    Trade and Instr (and others) as the subclass.

    Here's the rub...

    The ID fields on the 3 tables do NOT express a hierarchy. They are unique
    to each table only. You cannot look up a Trade's BaseEntity by using the
    trade ID and finding a matching LINKID in BaseEntity.

    The connection is actually the BASEENTITY.LINKID field. The LINKID matches
    IDs in the TRADE or INSTR table. Like this:

    BASEENTITY
    ID=1, LINKID=100
    ID=2, LINKID=200

    TRADE
    ID=100

    INSTR
    ID=200

    Hibernate cannot handle this. Unidirectional one to one relationships
    require annotation on each end. The 'table per class' inheritance model
    requires the ID fields in TRADE and INSTR to be foreign keys of BASEENTITY,
    which they are not.

    Look forward to any advice.
    Thanks,
    John
  • Summers, John1 at Apr 1, 2010 at 4:27 pm
    Thanks Robert,

    Good point and I have made a stupid ommission in my description. In fact BASEENTITY has a column 'REF' on it which together with LINKID provides uniqueness:

    BASEENTITY
    ID=1, LINKID=100, REF='Trade'
    ID=2, LINKID=200, REF='Instr'
    (LINKID and REF together have a unique index on them)

    TRADE
    ID=100

    INSTR
    ID=200

    And in the current data access layer the DAO's actually work out which type of entity they are building and and provide the correct discriminator ('Trade', 'Instr', etc) for the sql statements to load in the data to the superclass.

    Cheers,
    John

    -----Original Message-----
    From: Robert Zeigler
    Sent: 01 April 2010 17:05
    To: [email protected]
    Subject: Re: can Cayenne handle an inheritance model like this?...

    How do you ensure that you don't wind up with duplicated LINKID values? Eg, if TRADE.ID assigned based on the value of LINKID, or is LINKID assigned based on the value of TRADE.ID and/or INSTR.ID?

    Robert
    On Thu, Apr 1, 2010 at 10:49 AM, Summers, John1 wrote:

    Hello Apache-Cayenne users,

    I am engaged on a project where we are trying to replace a messy
    bespoke Data Access Layer with a more modern ORM framework. We have
    been looking at Hibernate but it cannot handle our inheritance model.
    I would like to ask if Cayenne can handle such a model because if it
    can we will continue and make a full assessmet of Cayenne. I will describe the model to you now:

    Ok the database tables look like this:

    BASEENTITY
    -ID
    -LINKID

    TRADE
    -ID

    INSTR
    -ID

    And the Java object hierarchy is that BaseEntity is the superclass
    with Trade and Instr (and others) as the subclass.

    Here's the rub...

    The ID fields on the 3 tables do NOT express a hierarchy. They are
    unique to each table only. You cannot look up a Trade's BaseEntity by
    using the trade ID and finding a matching LINKID in BaseEntity.

    The connection is actually the BASEENTITY.LINKID field. The LINKID
    matches IDs in the TRADE or INSTR table. Like this:

    BASEENTITY
    ID=1, LINKID=100
    ID=2, LINKID=200

    TRADE
    ID=100

    INSTR
    ID=200

    Hibernate cannot handle this. Unidirectional one to one relationships
    require annotation on each end. The 'table per class' inheritance
    model requires the ID fields in TRADE and INSTR to be foreign keys of
    BASEENTITY, which they are not.

    Look forward to any advice.
    Thanks,
    John
  • Andrus Adamchik at Apr 1, 2010 at 7:01 pm
    Hi John,

    Since we have a discriminator column, in Cayenne this can be mapped
    via single-table inheritance. Here are two ways of mapping with
    examples that I created in about 15 minutes using Cayenne 3.0 and
    embedded Derby DB. In both cases we map ID + LINKID as a compound PK
    (even though LINKID is not a PK in the DB, we'll make Cayenne think it
    is) :

    1. Mapping as single table inheritance with flattened attributes of
    the joined entity.

    http://people.apache.org/~aadamchik/demo/inheritance-test.0.tar.gz

    Got a little problem with that - an exception on commit. LINKID is not
    propagated from TRADE and INSTR back to BASEENTITY. Oops... This is
    clearly a bug in Cayenne. Will need to fix it.

    So until that I tried something else:


    2. Mapping as single table inheritance with relationship from
    subclasses to specific entities

    http://people.apache.org/~aadamchik/demo/inheritance-test.1.tar.gz

    This works all the way, although requires just a bit more code to
    handle dependent object.

    So Cayenne can handle this case (and when we fix 1., hide most DB
    aspects of it).

    Hope this helps

    Andrus



    On Apr 1, 2010, at 7:25 PM, Summers, John1 wrote:

    Thanks Robert,

    Good point and I have made a stupid ommission in my description. In
    fact BASEENTITY has a column 'REF' on it which together with LINKID
    provides uniqueness:

    BASEENTITY
    ID=1, LINKID=100, REF='Trade'
    ID=2, LINKID=200, REF='Instr'
    (LINKID and REF together have a unique index on them)

    TRADE
    ID=100

    INSTR
    ID=200

    And in the current data access layer the DAO's actually work out
    which type of entity they are building and and provide the correct
    discriminator ('Trade', 'Instr', etc) for the sql statements to load
    in the data to the superclass.

    Cheers,
    John

    -----Original Message-----
    From: Robert Zeigler
    Sent: 01 April 2010 17:05
    To: [email protected]
    Subject: Re: can Cayenne handle an inheritance model like this?...

    How do you ensure that you don't wind up with duplicated LINKID
    values? Eg, if TRADE.ID assigned based on the value of LINKID, or is
    LINKID assigned based on the value of TRADE.ID and/or INSTR.ID?

    Robert

    On Thu, Apr 1, 2010 at 10:49 AM, Summers, John1 <[email protected]
    wrote:
    Hello Apache-Cayenne users,

    I am engaged on a project where we are trying to replace a messy
    bespoke Data Access Layer with a more modern ORM framework. We have
    been looking at Hibernate but it cannot handle our inheritance model.
    I would like to ask if Cayenne can handle such a model because if it
    can we will continue and make a full assessmet of Cayenne. I will
    describe the model to you now:

    Ok the database tables look like this:

    BASEENTITY
    -ID
    -LINKID

    TRADE
    -ID

    INSTR
    -ID

    And the Java object hierarchy is that BaseEntity is the superclass
    with Trade and Instr (and others) as the subclass.

    Here's the rub...

    The ID fields on the 3 tables do NOT express a hierarchy. They are
    unique to each table only. You cannot look up a Trade's BaseEntity by
    using the trade ID and finding a matching LINKID in BaseEntity.

    The connection is actually the BASEENTITY.LINKID field. The LINKID
    matches IDs in the TRADE or INSTR table. Like this:

    BASEENTITY
    ID=1, LINKID=100
    ID=2, LINKID=200

    TRADE
    ID=100

    INSTR
    ID=200

    Hibernate cannot handle this. Unidirectional one to one relationships
    require annotation on each end. The 'table per class' inheritance
    model requires the ID fields in TRADE and INSTR to be foreign keys of
    BASEENTITY, which they are not.

    Look forward to any advice.
    Thanks,
    John

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupuser @
categoriescayenne
postedApr 1, '10 at 3:50p
activeApr 1, '10 at 7:01p
posts4
users3
websitecayenne.apache.org

People

Translate

site design / logo © 2023 Grokbase