EclipseLink如何命名外键?

时间:2018-10-29 15:44:01

标签: java oracle jpa foreign-keys eclipselink

我在Java项目中使用EclipseLink 2.6.2和Oracle。我想了解EclipseLink如何决定命名外键。

当前,当我启动我的应用程序时,出现错误,表明约束名称已经存在。我可以查询数据库并查看创建了哪些外键,并且看到具有相同名称的外键,但是我不清楚它是如何创建名称的。显然是在剥离所有元音,但是是使用表一和表二还是列名?

这是错误:

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

它正在尝试为表 publctncompntdef_hist_ref 的表创建外键,其中表 bidpackComponentDefinitionId 引用了表 bidpckcompntdef 和列 bidpackComponentDefinitionId

但是它已经为表 publctncompntdefref 和表 bidpckcompntdef 和列的表 publctncompntdefref 创建了具有相同名称的外键。 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")})

1 个答案:

答案 0 :(得分:0)

我想我明白了。我最初并没有意识到EclipseLink是开源的,但最终我发现了这一点并从以下网址下载了代码:https://github.com/eclipse/eclipselink.runtime

基本上它是做什么的

  1. 如果FK_ +表名+ _ +列名大于限制(对于Oracle为30个字符),则丢弃FK_前缀。
  2. 如果仍然太长,请删除所有下划线或其他非字母或数字的内容。
  3. 如果仍然太长,请删除元音
  4. 如果时间仍然太长:
    4a。检查不带元音的列名称是否大于限制(30个字符)。如果是这样,请使外键名称只是列名减去元音,并从末尾截断为最大大小
    4b。否则,将表名截断为剩余多少个字符(最大限制-列名长度)

这就是我的情况:
表名称= publctncompntdefref(19个字符),列名称= bidpackcomponentdefinitionid(28个字符)
减去元音= pblctncmpntdfrf(15个字符)和bdpckcmpnntdfntnd(17个字符)
将这两个连接起来可以得到32个字符。由于没有元音的列名少于30个字符(对于oracle来说最大),因此将表名截断为(30-17 = 13个字符),即pblctncmpntdf。整个外键名称为pblctncmpntdfbdpckcmpnntdfntnd。

类似地,当我有表名= publctncompntdef_hist_ref和列名= bidpackcomponentdefinitionid时,没有元音,我最终得到了pblctncmpntdfhstrf和bdpckcmpnpnntdfntnd。表名是18个字符,列名是17个字符。因此,该表必须被截断为13个字符,因此pblctncmpntdfhstrf变为pblctncmpntdf,整个外键变为pblctncmpntdfbdpckcmpnntdfntnd。

这说明了为什么EclipseLink告诉我该名称已经存在外键约束。