Hey Derby Users,
I'm designing an application to keep up with my music collection. It's
currently running fine on Hibernate/One$DB until I execute 20k or so
transactions. Then, the JVM runs out of memory. After profiling it, I
determined that the leaks are related to One$DB and that's just the
final straw for me. I submitted some questions to the One$DB forums,
but they're not very active and there doesn't seem to be a new version
forthcoming. So, I'm shopping aroiund for a better embedded RDBMS and
I've heard great things about Derby.
After porting my schema over, I ran into something that's peculiar (to
me, anyway) and I'd appreciate any advice that you can give. My
apologies if this is not Derby-specific, but I didn't have any problems
doing this in my schema with either MySQL or One$DB.
Here are the important snippets from my DDL script (I snipped the
irrelevant columns and tables):
CREATE TABLE playable (
id INTEGER GENERATED ALWAYS AS IDENTITY,
CONSTRAINT pk_playable_id PRIMARY KEY (id)
);
CREATE TABLE track (
id INTEGER,
CONSTRAINT pk_track_id PRIMARY KEY (id),
CONSTRAINT fk_track_id FOREIGN KEY (id) REFERENCES playable_t(id) ON
DELETE CASCADE
);
CREATE TABLE mediafile (
id INTEGER,
trackid INTEGER,
CONSTRAINT pk_mediafile_id PRIMARY KEY (id),
CONSTRAINT fk_mediafile_id FOREIGN KEY (id) REFERENCES playable_t(id)
ON DELETE CASCADE,
CONSTRAINT fk_mediafile_trackid FOREIGN KEY (trackid) REFERENCES
track_t(id) ON DELETE SET NULL
);
When I run that, I get:
ERROR 42915: Foreign Key 'FK_MEDIAFILE_TRACKID' is invalid because 'the
delete rule of foreign key must be CASCADE. (The relationship would
cause the table to be delete-connected to the same table through
multiple relationships and such relationships must have the same delete
rule (NO ACTION, RESTRICT or CASCADE).) '
So, I looked it up in the DB2 docs and I understand where the error is
coming from, but I don't see how to design around it. What I want is to
have tracks and mediafiles with unique IDs (across both tables). The
playable table should achieve that. If the parent playable is deleted,
I want the track or mediafile subclass (in Hibernate/Java terms) to be
deleted as well. If the parent track of a mediafile is deleted, I want
the mediafile's trackid to be set to NULL.
I think that I understand why the delete-connected restriction is there,
but since I have the foreign keys in two separate columns and the parent
rows of any involved track and mediafile rows must be dependent on
different rows in the playable table, I don't think that it should be an
issue for me (logically, anyway).
Can anyone think of a workaround (or a better way to design the
schema)? I thought about using a shared sequence, but that's not
avaiable either.
Thanks for your help!
-Justin