Java EclipseLink如何命名外键?
我在Java项目中使用EclipseLink 2.6.2和Oracle。我想了解EclipseLink是如何决定命名外键的 当前,当我启动我的应用程序时,我收到一个错误,即约束名称已经存在。我可以查询数据库,看看创建的外键是什么,我看到的外键具有相同的名称,但我不清楚它是如何创建名称的。很明显,它去掉了所有元音,但它是使用表1和表2,还是使用列名 以下是错误:Java EclipseLink如何命名外键?,java,oracle,jpa,foreign-keys,eclipselink,Java,Oracle,Jpa,Foreign Keys,Eclipselink,我在Java项目中使用EclipseLink 2.6.2和Oracle。我想了解EclipseLink是如何决定命名外键的 当前,当我启动我的应用程序时,我收到一个错误,即约束名称已经存在。我可以查询数据库,看看创建的外键是什么,我看到的外键具有相同的名称,但我不清楚它是如何创建名称的。很明显,它去掉了所有元音,但它是使用表1和表2,还是使用列名 以下是错误: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.2.v
Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.2.v20151217-774c696): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: ORA-02264: name already used by an existing constraint
Error Code: 2264
Call: ALTER TABLE publctncompntdef_hist_ref ADD CONSTRAINT pblctncmpntdfbdpckCmpnntDfntnd FOREIGN KEY (bidpackComponentDefinitionId) REFERENCES bidpckcompntdef (bidpackComponentDefinitionId)
它试图创建的外键的名称是:pblctncmpntdfbdpckCmpnntDfntnd
它正在尝试为表PublCtnComponentDef_hist_ref创建一个外键,以指向列bidpackComponentDefinitionId引用表BidPCkComponentDef和列bidpackComponentDefinitionId
但是它已经为表PublCtnComponentDefRef创建了一个同名外键,其中列bidpackComponentDefinitionId到表BidPCkComponentDef和列bidpackComponentDefinitionId
我在谷歌上搜索过,但似乎找不到关于外键命名策略的文档
此外,以下是@JoinTable值:
@JoinTable(name = "publctncompntdef_hist_ref",
joinColumns={@JoinColumn(name="publicationHistoryId",referencedColumnName="id")},
inverseJoinColumns={@JoinColumn(name="bidpackComponentDefinitionId",referencedColumnName="bidpackComponentDefinitionId")})
@JoinTable(name = "publctncompntdefref",
joinColumns={@JoinColumn(name="bidpackComponentDefinitionId",referencedColumnName="bidpackComponentDefinitionId")},
inverseJoinColumns={@JoinColumn(name="publicationId",referencedColumnName="id")})
我想我明白了。我最初没有意识到EclipseLink是开源的,但我最终发现了这一点,并从以下网站下载了代码: 基本上,它似乎做的是
4a。检查没有元音的列名是否大于限制(30个字符)。如果是这样,则使外键名仅为列名减去元音,从末尾截断为最大大小
4b。否则,将表名截断为剩余的字符数(最大限制-列名长度)
表名=publctncompntdefref(19个字符)和列名=bidpackcomponentdefinitionid(28个字符)
减去元音=pblctncmpntdfrf(15个字符)和bdpckcmpnntdfntnd(17个字符)
将这两个字符连接在一起可以得到32个字符。由于没有元音的列名少于30个字符(oracle的最大值),因此将表名截断为(30-17=13个字符),即pblctncmpntdf。整个外键名为pblctncmpntdfbdpckcmpnntdfntnd 类似地,当我的表名为publctncompondentfef_hist_ref,列名为bidpackcomponentdefinitionid,没有元音时,我的结果是pblctncmpntdfhstrf和bdpckcmpntdfntnd。表名为18个字符,列名为17个字符。因此,表需要构造为13个字符,因此pblctncmpntdfhstrf变为pblctncmpntdf,整个外键变为pblctncmpntdfbdpckcmpnntdfntnd
这就是为什么EclipseLink告诉我已经有一个外键约束使用该名称。
pblctncmpntdfbdpckCmpnntDfntnd
有30个字符长,这是oracle的限制(除非您使用的是启用扩展名称语义的oracle 12cR2)。但这是一个如此可怕的名字,你最好不要有名字,而是让Oracle生成一个SYS\uu
名字。不知道你是怎么说服EclipseLink这么做的。完全同意你的观点。不幸的是,我正在使用Oracle 12cR1。