为什么 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。
我一直在尝试使用 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。