2012-04-10 5 views
3

У меня есть последующий сценарий для создания таблицы autolife.log:JPA: MySQL говорит таблица не существует, но она существует на самом деле

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, Indigo :

@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 

когда я бег в моем LOCALHOST компьютере, работает нормально, но когда я экспортировать .war и поставить в производстве, дает мне эту ошибку (ниже вы можете увидеть исключение сгенерированного кода):

[email protected]:~/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 

Что я должен делать здесь?

ответ

8

Дело чувствительность MySQL имена таблиц depends on operating system, я предполагаю, что это причина:

In MySQL, databases correspond to directories within the data directory. Each table within a database corresponds to at least one file within the database directory (and possibly more, depending on the storage engine). Consequently, the case sensitivity of the underlying operating system plays a part in the case sensitivity of database and table names. This means database and table names are not case sensitive in Windows, and case sensitive in most varieties of Unix. One notable exception is Mac OS X, which is Unix-based but uses a default file system type (HFS+) that is not case sensitive. However, Mac OS X also supports UFS volumes, which are case sensitive just as on any Unix.

Итак, вам нужно задать имя таблицы в правильном случае явно:

@Entity @Table(name = "log") 
public class Log implements Serializable { ... } 
+0

Большое вам спасибо! Это работает. –

0

прохладный вопрос. насчет

USE <Database Name> 
GO 

пункт перед выполнением сценария?

Обычно все SP, таблицы имеют эти 2 строки перед исполнением

+0

это как-то не выглядит очень Java-иш для меня ?? ._.? – Blauhirn

Смежные вопросы