[hibernate-issues] [Hibernate-JIRA] Created: (HBX-1100) hbm2dll creates FK constraint names that are too large for taget database dialect

Duncan Keysell (JIRA) noreply at atlassian.com
Tue Dec 9 13:21:16 EST 2008


hbm2dll creates FK constraint names that are too large for taget database dialect
---------------------------------------------------------------------------------

                 Key: HBX-1100
                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HBX-1100
             Project: Hibernate Tools
          Issue Type: Bug
    Affects Versions: 3.2.4 Beta1
            Reporter: Duncan Keysell


When hbm2dll creates FK constraint names, it does so without following database resrictions. As hbm2dll knows it is using the Oracle10gDialect then it should not attempt to create FK constraint names that have more than 30 characters. With union-subclass mapping the pattern used by hbm2dll is to give a FK constraint an 18 character name on the class that directly has the association requiring the FK. If that class is subclassed the FK constraint added to the tables of the subclasses has 18+8n characters. Where n is the level of subclassing. Only two levels of subclassing are required before the constraint name exceeds 30 characters as below. 

I know it is possible to configure the initial name used for constraints using the foreign-key attribute in the mapping. However if I set that to 1 character then I still have a problem when 1 + 4*8 = 33. Therefore even using the foreign-key attribute I can only get 3 levels of subclassing. 

Shouldn't the algorithm to create FK names be aware of the 30 character limit, i.e be dialect aware. Couldn't it simply create a hashcode of the hashcode it currently creates and limit it to 30 characters (including the 'FK'). 

In the example below constraints of the lengths shown get added to each table for the many-to-one mapping with name="requestedNE": 

Class 
IACEndpointConfigElement (FK4C10C05A145A4B50) 18 chars 
IInterfaceConfigElement (FK4C10C05A145A4B50b6728c4a) 18 + 8 = 26 chars 
IFRvcConfigElement (FK4C10C05A145A4B50b6728c4ace4cc838) 18 + 8 + 8 = 34 chars ERROR 


Hibernate version: 
3.2.2 
Mapping documents: 

<class name="productSpecific.advancedAppInterfaces.attachmentCircuitService.IACEndpointConfigElement" table="IACEndpointConfigElement" abstract="true"> 

<many-to-one name="requestedNE" 
class="productSpecific.advancedAppInterfaces.attachmentCircuitService.IACServiceNEAssignmentConfigElement" 
column="requestedNE_ID" 
foreign-key="none" 
not-found="ignore" 
/> 
<union-subclass name="productSpecific.advancedAppInterfaces.attachmentCircuitService.IInterfaceConfigElement" table="IInterfaceConfigElement" abstract="false"> 
<union-subclass name="productSpecific.advancedAppInterfaces.attachmentCircuitService.IFRvcConfigElement" table="IFRvcConfigElement" abstract="false"> 
</union-subclass> 
</union-subclass> 
</class 

Code between sessionFactory.openSession() and session.close(): 
N/A 
Full stack trace of any exception that occurs: 
N/A 
Name and version of the database you are using: 
Oracle 10g 
The generated SQL (show_sql=true): 

[hibernatetool] 2008-11-26 09:56:40,000 DEBUG SchemaExport:303 - 
[hibernatetool] create table developer.IFRvcConfigElement ( 
[hibernatetool] INSTANCEID number(19,0) not null, 
[hibernatetool] oid varchar2(2048 char) not null, 
[hibernatetool] ReferenceKey varchar2(2048 char), 
[hibernatetool] InstanceName varchar2(255 char), 
[hibernatetool] InstanceDescription varchar2(255 char), 
[hibernatetool] requestedNE_ID number(19,0), 
[hibernatetool] ProtocolIFType number(10,0), 
[hibernatetool] InterfaceEncapType number(10,0), 
[hibernatetool] Dlci number(10,0), 
[hibernatetool] primary key (INSTANCEID) 
[hibernatetool] ); 

[hibernatetool] alter table developer.IFRvcConfigElement 
[hibernatetool] add constraint FK4C10C05A145A4B50b6728c4ace4cc838 
[hibernatetool] foreign key (requestedNE_ID) 
[hibernatetool] references developer.IACSrvcNEAssgnmntCnfgElmnt; 
[hibernatetool] 2008-11-26 10:00:18,515 ERROR SchemaExport:274 - Unsuccessful: alter table developer.IFRvcConfigElement add constraint FK4C10C05A145A4B50b6728c4ace4cc838 foreign key (requestedNE_ID) references developer.IACSrvcNEAssgnmntCnfgElmnt 
[hibernatetool] 2008-11-26 10:00:18,515 ERROR SchemaExport:275 - ORA-00972: identifier is too long 

Debug level Hibernate log excerpt: 
DEBUG 

Problems with Session and transaction handling? 
N/A

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the hibernate-issues mailing list