【发布时间】:2019-04-02 14:20:23
【问题描述】:
我在我的 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 创建了一个同名的外键,其中列 bidpackComponentDefinitionId 到表 bidpckcompntdef 和列 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")})
【问题讨论】:
-
pblctncmpntdfbdpckCmpnntDfntnd的长度为 30 个字符,这是 oracle 的限制(除非您使用启用了扩展名称语义的 Oracle 12cR2)。但这是一个可怕的名字,你最好不要有一个名字,而是让 Oracle 生成一个SYS_名字。不知道你是如何说服 EclipseLink 这样做的。 -
完全同意你的看法。而且,不幸的是,我正在使用 Oracle 12cR1。
标签: java oracle jpa foreign-keys eclipselink