2012-04-10 4 views
3

ich den Follow-Skript habe die Tabelle autolife.log zu erstellen:JPA: MySQL sagt Tabelle nicht existieren, aber es existiert tatsächlich

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$$ 

So verwende ich die JPA Tools Entity erstellen aus den Tabellen in 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 

wenn ich in meinem lokalen Host-Computer laufen arbeitet, in Ordnung, aber wenn ich die .war Export und Produktion setzen in, gibt mir diese Fehlermeldung (siehe unten Sie die Ausnahme von der generierte Code sehen):

[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 
|#] 

Wie Sie sehen können, gibt es die Tabelle nicht existieren, aber existieren Ich exportiere von meiner localhost Datenbank und importiere auf den Produktionshost. Aber immer noch gibt diesen Fehler:

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

Was soll ich hier tun?

Antwort

8

Fall Empfindlichkeit von MySQL Tabellennamen depends on operating system, ich denke, das ist die Ursache:

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.

So müssen Sie Tabellennamen im richtigen Fall setzen sollen ausdrücklich:

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

Vielen Dank! Es funktioniert. –

0

kühle Frage. Was

USE <Database Name> 
GO 

Klausel vor Skript ausgeführt?

Normalerweise haben alle SP, Tabellen diese 2 Zeilen vor der Ausführung

+0

das sieht irgendwie nicht sehr Java-ish für mich aus? ._.? – Blauhirn