gpt4 book ai didi

java - 为什么 Toplink 强制表名大写?

转载 作者:行者123 更新时间:2023-11-29 12:09:43 25 4
gpt4 key购买 nike

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

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)

这是物质类别:

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 工具检查了表“decalin.substances”是否存在。但为什么它一直在寻找“decalin.SUBSTANCES”?

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

所以,我最终在 Substance 类中添加了 @Table(name = "substances") 注解,一切顺利。

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

最佳答案

Windows 没有区分大小写的文件系统。正如您在/var/lib/mysql (或 mysql 存储数据的任何位置)中看到的,每个数据库表都有自己的文件(带有 .frm 和 .ibd 扩展名)。因此,在不区分大小写的情况下,文件系统表名不区分大小写,而在区分大小写的情况下(如 Linux 上的 ext4),则它们是区分大小写的。请参阅MySQL documentation了解更多信息。

关于java - 为什么 Toplink 强制表名大写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30903699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com