Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EclipseLink如何命名外键?_Java_Oracle_Jpa_Foreign Keys_Eclipselink - Fatal编程技术网

Java EclipseLink如何命名外键?

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

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

当前,当我启动我的应用程序时,我收到一个错误,即约束名称已经存在。我可以查询数据库,看看创建的外键是什么,我看到的外键具有相同的名称,但我不清楚它是如何创建名称的。很明显,它去掉了所有元音,但它是使用表1和表2,还是使用列名

以下是错误:

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是开源的,但我最终发现了这一点,并从以下网站下载了代码:

基本上,它似乎做的是

  • 如果FK+表名++列名大于限制(Oracle为30个字符),请删除FK+前缀
  • 如果仍然太长,请删除任何下划线或其他非字母或数字的内容
  • 如果仍然太长,就去掉元音
  • 如果仍然太长:
    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。