我在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")})
答案 0 :(得分:0)
我想我明白了。我最初并没有意识到EclipseLink是开源的,但最终我发现了这一点并从以下网址下载了代码:https://github.com/eclipse/eclipselink.runtime
基本上它是做什么的
这就是我的情况:
表名称= 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告诉我该名称已经存在外键约束。