为什么 Toplink 在 table 个名称中强制使用大写字母?

Why does Toplink force uppercase in table names?

我一直在尝试使用 MySQL 和 Toplink 在 Ubuntu 14.04 上设置 Glassfish,因此我使用 JSF 2.2 创建了一个简单的 WebApp 来测试是否一切正常 运行。然而,我 运行 进入了一些我不太明白的东西。我指定了@Entity (name = "substances"),如您所见,这是我的 table 的小写名称(已存在于数据库中)。但是,在我看来,Toplink t运行 将其名称设为大写,显然找不到它:

javax.persistence.RollbackException: Exception [EclipseLink-4002]
(Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd):
org.eclipse.persistence.exceptions.DatabaseException Internal Exception:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table
'decalin.SUBSTANCES' doesn't exist Error Code: 1146 Call: INSERT INTO
SUBSTANCES (substance_name) VALUES (?) bind => [1 parameter bound] Query:
InsertObjectQuery(org.malik.decalin.beans.Substance@58759bfa)

这是物质 class:

package org.malik.decalin.beans;

import org.malik.decalin.dao.DataAccess;
import java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity (name = "substances")
@Named
@RequestScoped
public class Substance implements Serializable {

@Id
@Column (name = "substance_id")
@GeneratedValue (strategy = GenerationType.IDENTITY)
Long id;

@Column (name = "substance_name")
String substanceName;

public String create() {
    DataAccess da = new DataAccess();
    Substance substance = new Substance();
    substance.setId(id);
    substance.setSubstanceName(substanceName);
    da.createSubstance(substance);
    return "jest";
}

// getters and setters

public Long getId() { return id; }
public void setId(Long id) { this.id = id; }

public String getSubstanceName() { return substanceName; }
public void setSubstanceName(String substanceName) { this.substanceName = substanceName; }    
}

此外,我确实使用 mysqlcheck 工具检查 table 'decalin.substances' 是否存在。但是为什么它一直在寻找'decalin.SUBSTANCES'?

当我 运行 在 Windows 8.1 上使用相同的代码时,没有报告任何问题...

所以,我终于在 Substance class 中添加了 @Table (name = "substances") 注释,一切都很顺利。

我的问题是,尽管将 @Entity 中的 'name' 属性设置为 "substances",为什么 Toplink 在 Ubuntu 上使用大写字母?为什么它在 Windows 上有效?也许我错过了 Toplink 设置中的某些内容(persistence.xml 在两种情况下都相同)。

Windows 没有区分大小写的文件系统。正如您在 /var/lib/mysql(或您的 mysql 存储数据的任何地方)中所见,每个数据库 table 都有自己的文件(扩展名为 .frm 和 .ibd)。因此,在不区分大小写的文件系统 table 上,名称不区分大小写,在区分大小写的情况下(如 Linux 上的 ext4)它们是。有关详细信息,请参阅 MySQL documentation