mysql - Eclipse JPA: MySQL表示表不存在,但实际上存在

  显示原文与译文双语对照的内容

我有下面的脚本来创建表 autolife.log:


CREATE TABLE `log` (


 `id` int(11) NOT NULL AUTO_INCREMENT,


 `idpoint` int(11) NOT NULL,


 `value` varchar(10) NOT NULL,


 `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,


 PRIMARY KEY (`id`),


 KEY `fk_point_id` (`idpoint`),


 CONSTRAINT `fk_point_id` FOREIGN KEY (`idpoint`) REFERENCES `point` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION


) ENGINE=InnoDB AUTO_INCREMENT=155562 DEFAULT CHARSET=latin2$$



所以我使用 JPA Tools 来从 Eclipse 中的表格创建实体:


@Entity


public class Log implements Serializable {


 private static final long serialVersionUID = 1L;



 @Id


 @SequenceGenerator(name="LOG_ID_GENERATOR", sequenceName="SEQUENCE_KEY")


 @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="LOG_ID_GENERATOR")


 private Integer id;



 private Timestamp time;



 private String value;



//bi-directional many-to-one association to Point


 @ManyToOne


 @JoinColumn(name="idpoint")


 private Point point;



 public Log() {


 }



//get's and set's



运行本地计算机时,运行正常,但当导出. war 并投入生产时,会出现这里错误( 下面你可以看到代码生成的异常):


ubuntu@domU-12-31-39-0A-12-7B:~/glassfish/glassfish3/glassfish/domains/domain1/logs$ vi server.log


 at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeCall(DatasourceCallQueryMechanism.java:193)


 at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.executeSelectCall(DatasourceCallQueryMechanism.java:264)


 at org.eclipse.persistence.internal.queries.DatasourceCallQueryMechanism.selectAllRows(DatasourceCallQueryMechanism.java:646)


 at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRowsFromTable(ExpressionQueryMechanism.java:2611)


 at org.eclipse.persistence.internal.queries.ExpressionQueryMechanism.selectAllRows(ExpressionQueryMechanism.java:2570)


 at org.eclipse.persistence.queries.ReadAllQuery.executeObjectLevelReadQuery(ReadAllQuery.java:420)


 at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeDatabaseQuery(ObjectLevelReadQuery.java:1081)


 at org.eclipse.persistence.queries.DatabaseQuery.execute(DatabaseQuery.java:844)


 at org.eclipse.persistence.queries.ObjectLevelReadQuery.execute(ObjectLevelReadQuery.java:1040)


 at org.eclipse.persistence.queries.ReadAllQuery.execute(ReadAllQuery.java:392)


 at org.eclipse.persistence.queries.ObjectLevelReadQuery.executeInUnitOfWork(ObjectLevelReadQuery.java:1128)


 at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.internalExecuteQuery(UnitOfWorkImpl.java:2871)


 at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1516)


 at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1498)


 at org.eclipse.persistence.internal.sessions.AbstractSession.executeQuery(AbstractSession.java:1463)


 at org.eclipse.persistence.internal.jpa.EJBQueryImpl.executeReadQuery(EJBQueryImpl.java:485)


 at org.eclipse.persistence.internal.jpa.EJBQueryImpl.getResultList(EJBQueryImpl.java:742)


 at com.brainset.eao.LogEAO.list(LogEAO.java:54)


 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)


 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)


 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)


 at java.lang.reflect.Method.invoke(Method.java:597)


 at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)


 at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)


 at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5388)


 at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)


 at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)


 at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)


 at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162)


 at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144)


 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)


 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)


 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)


 at java.lang.reflect.Method.invoke(Method.java:597)


 at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861)


 at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)


 at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370)


 at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5360)


 at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5348)


 at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214)


. . . 44 more


Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'autolife.LOG' doesn't exist


 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)


 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)


 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)


 at java.lang.reflect.Constructor.newInstance(Constructor.java:513)


 at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)


 at com.mysql.jdbc.Util.getInstance(Util.java:386)


 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)


 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4098)


 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4030)


 at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)


 at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)


 at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2677)


 at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2134)


 at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2300)


 at com.sun.gjc.spi.jdbc40.PreparedStatementWrapper40.executeQuery(PreparedStatementWrapper40.java:642)


 at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.executeSelect(DatabaseAccessor.java:931)


 at org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor.basicExecuteCall(DatabaseAccessor.java:607)


. . . 88 more


|#]



正如你所看到的,表不存在,但是我从localhost数据库中导出并导入到生产主机。 但仍然给出了这个错误:


Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'autolife.LOG' doesn't exist



我该在这里做什么?

时间: 原作者:

MySQL表名称的区分大小写取决于操作系统的名称,我猜这就是原因:

在MySQL中,数据库对应于数据目录中的目录。 数据库中的每个表都对应于数据库目录( 而且可能更多取决于储存引擎) 中至少一个文件。 因此,底层操作系统的案例敏感性在数据库和表名称的区分灵敏度方面发挥了作用。 这意味着数据库和表名在 Windows 中不区分大小写,并且在大多数Unix中区分大小写。 一个显著的例外是 Mac OS X,它是 unix,但使用默认的文件系统类型( HFS+ ),它不区分大小写。 但是,Mac OS X 也支持UFS卷,这与任何Unix一样敏感。

因此,你需要在正确的情况下设置表名称:


@Entity @Table(name ="log")


public class Log implements Serializable {.. . }



原作者:
...