It's worth noting that "derived entities" and "inheritence" aren't
the same concept in cayenne.
Dervied entitities are essentially database "views", modified by a
query.
Also, cayenne has supported what you can "flat" inheritence (single-
table inheritence) for some time now.
(For as long as I've been using it, which is over 4 years now).
Robert
On Mar 27, 2008, at 3/279:33 AM , Marcin Skladaniec wrote:
Hello
I've been using open source software, and Cayenne in particular, for
quite some time now. Now finally comes a great opportunity for me
to contribute something back to the open source world.
It is sad that I could not do much until the incentive from Google
came along, but let me just blame the fact that I'm a busy student...
I have already talked to Andrus about the possible projects I could
undertake, and to my great contentment he liked the idea of
implementing inheritance in Cayenne and agreed to be my mentor for
SoC2008.
I put together a proposal, and at the end of this email you can find
the most important fragment of it (I skipped all the 'why me' bits ).
Any feedback is most welcomed !
Best regards
Marcin
"There are several object-relational mapping (ORM) java frameworks
in existence, and in my opinion Cayenne (http://cayenne.apache.org/)
is one of the best. Cayenne has clear and consistent API, and great,
most vibrant community I met in the open source world.
Cayenne has many features you one would expect ORM to have, but it
is lacking one important feature which is present in competing
projects like Hibernate: inheritance. I would like to propose a
Summer of Code project bringing inheritance to Cayenne.
At the moment Cayenne does support only some sort of flat
inheritance (called 'derived entities' ), but it is already marked
as deprecated and will be excluded from future versions.
I believe (re)adding this feature is going to highly improve Cayenne
as ORM, I have already found myself missing it few times when
working on various database designs.
There are few ways of designing inheritance, mentioned before flat
inheritance, vertical inheritance and horizontal inheritance. I
would like to explain differences between them to explain what I
would like to do. I'll use an example to illustrate each type, in
the examples I'll use notation Table[field1, field2,..] to describe
the database structure and Entity<field1, field2,...> to describe
entities.
Without inheritance a database table is simply mapped to a java
class (which is often called an entity).
Example: If an application has an entity representing different
payments each type of payment needs to be stored in separate table
and will be mapped to a separate entity, ie.
- CreditCardPayment[amount, bankedDate, ccNumber, ccExpiry, ...] <=>
CreditCardPayment<amount, bankedDate, ccNumber, ccExpiry, ...>
- ChequePayment[amount, dateBanked, chequeBank, ...] <=>
ChequePayment<amount, dateBanked, chequeBank, ...>
- CashPayment[amount, dateBanked, ...] <=> CashPayment<amount,
dateBanked, ...>
As can be seen some fields gets duplicated, and as there is no
inheritance between the java classes the application ends up with
plenty duplicate code. Also the relationships between the entities
might get complicated, for example an Invoice would need to have
separate relationship to each payment table.
Flat inheritance does use a single table, but allows mapping this
table into several entities. There are some benefits of this type of
inheritance like it does not require any joins, likewise inserting
data does affect only one table. Using flat inheritance has only
limited usage, and if used to extensively leads to tables with too
many columns to be readable and understandable.
Example: In the same situation as before there would be only one
table defining all the fields :
- Payment[amount, bankedDate, ccNumber, ccExpiry,...,
chequeBank, ...] <=> CreditCardPayment<amount, bankedDate, ccNumber,
ccExpiry, ...>, ChequePayment<amount, dateBanked, chequeBank, ...>,
CashPayment<amount, dateBanked, ...>
Modelling the relationships becomes much easier, but as each entity
still is separate there is a high possibility of duplicate code.
Horizontal inheritance can be considered a small improvement over
the no inheritance model, keeping the duplication of the fields on
the database and entity level, but allowing to gather some code
together. I'm finding this approach a little confusing and counter-
intuitive, but it certainly has a reason behind: it does avoid the
slowness related with vertical inheritance.
Example:
- (no database table) <=> Payment<amount, bankedDate, ...>
implements/extends CreditCardPayment, ChequePayment, CashPayment
- CreditCardPayment[ccNumber, ccExpiry, ...] <=>
CreditCardPayment<ccNumber, ccExpiry, ...>
- ChequePayment[chequeBank, ...] <=> ChequePayment<chequeBank, ...>
- CashPayment[...] <=> CashPayment<...>
Vertical inheritance escapes the problems of flat inheritance by
storing data relevant to an entity in a dedicated table. Resulting
database schema is cleaner and easier to maintain when adding new
entities and tables. There is a cost linked with this type of
inheritance: the database transaction speeds are lower, since each
fetching query must use a join and storing data has to be executed
against each table.
Example: Again the same situation as in previous cases. In vertical
inheritance there is a common table and common entity class finally
creating a room for the code common to all Payments:
- Payment[amount, bankedDate, ...] <=> Payment<amount,
bankedDate, ...>
- CreditCardPayment[ccNumber, ccExpiry, ...] <=>
CreditCardPayment<ccNumber, ccExpiry, ...> extends Payment
- ChequePayment[chequeBank, ...] <=> ChequePayment<chequeBank, ...>
extends Payment
- CashPayment[...] <=> CashPayment<...> extends Payment
My Google Summer of Code is going to bring the inheritance to
Cayenne. Certainly I would like to implement the vertical
inheritance, albeit it might have performance impact, it also seems
to be the most advanced model. If the time will allow I'll put my
effort to also implement either flat or horizontal inheritance,
consulting the Cayenne community to find which one is more
anticipated. "