[ https://issues.apache.org/jira/browse/OPENJPA-2795?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17187669#comment-17187669 ]
Mark Struberg commented on OPENJPA-2795: ---------------------------------------- Hi Robert! looks quite good. Do you mind shipping a patch with {{git format-patch}}? That way we can preserve your user info. txs! > generate foreign key indexes for Oracle > --------------------------------------- > > Key: OPENJPA-2795 > URL: https://issues.apache.org/jira/browse/OPENJPA-2795 > Project: OpenJPA > Issue Type: Bug > Components: jdbc > Affects Versions: 2.4.3, 3.1.0 > Reporter: Mark Struberg > Assignee: Mark Struberg > Priority: Major > Attachments: OPENJPA-2795.patch > > > When generating a schema SQL via OpenJPA then we do omit the CREATE INDEX if > there is a Forein Key CONSTRAINT generated. > For the following please consider an Entity {{CarLicensePlate}} which has a > {{@ManyToOne}} on {{Customer}}. > Without giving any further generator options we generate the correct CREATE > INDEX statement: > {noformat} > CREATE TABLE CUSTOMER (ID NUMBER NOT NULL, active VARCHAR(1), name > VARCHAR2(255), PRIMARY KEY (ID)); > CREATE TABLE LIC_PLATE (id VARCHAR2(255) NOT NULL, maker VARCHAR2(255), model > VARCHAR2(255), optLock NUMBER, CUSTOMER_ID NUMBER, PRIMARY KEY (id)); > CREATE INDEX I_LIC_PLT_CUSTOMER ON LIC_PLATE (CUSTOMER_ID); > {noformat} > But once we switch on explicit foreign key constraints via > {noformat} > <MappingDefaults>ForeignKeyDeleteAction=restrict, > JoinForeignKeyDeleteAction=restrict</MappingDefaults> > {noformat} > then the index is omitted. > {noformat} > CREATE TABLE CUSTOMER (ID NUMBER NOT NULL, active VARCHAR(1), name > VARCHAR2(255), PRIMARY KEY (ID)); > CREATE TABLE LIC_PLATE (id VARCHAR2(255) NOT NULL, maker VARCHAR2(255), model > VARCHAR2(255), optLock NUMBER, CUSTOMER_ID NUMBER, PRIMARY KEY (id)); > ALTER TABLE LIC_PLATE ADD FOREIGN KEY (CUSTOMER_ID) REFERENCES CUSTOMER (ID) > DEFERRABLE; > {noformat} > This is ok for most databases as a foreign key constraint they usually > automatically internally create an index as well. But sadly this is not the > case for Oracle. Here we would actually need both, the constraint and the > index. > There is even an own switch {{IndexLogicalForeignKeys}} in > {{MappingDefaults}}. But this doesn't really do what we need right now in > this case. It's more a switch to disable index creating even if there is no > constraints. > We could either introduce a new flag in MappingDefaults or change the > IndexLogicalForeignKeys from boolean to Boolean or even an enum with a > {{FORCED}}. > Even better would be a DbDictionary specific handling. That way we could > create the index automatically for Oracle while skipping it for others. -- This message was sent by Atlassian Jira (v8.3.4#803005)