mysql - 如何使用TomEE plus和JPA连接并查询数据库?

标签 mysql database jpa openjpa apache-tomee

我正在使用 persistence.xml 连接到在线 MySQL 数据库。我正在使用 JPA 和 openJPA 插入数据。我希望程序在插入实体时创建一个表。有人告诉我

    <property name="openjpa.jdbc.DBDictionary" value="mysql"/>
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>

将为我创建一个表(如果它尚不存在)。有人能告诉我为什么我会收到这个奇怪的错误吗?我不明白为什么数据库无法创建该表,因为没有外键限制。它很奇特,因为如果我直接将其插入到我的数据库中,我可以获取它所声明的精确 SQL 查询并很好地执行它。我已将所有数据库权限授予该用户。那么,当我尝试在插入之前创建表时,为什么会抛出此错误?

我没有使用 Maven、Hibernate 或 Spring MVC。我正在与一个小组合作解决这个问题,我想要一种相对较小且简单的方法来创建实体。我需要能够通过与在线数据库通信来验证用户身份。

 INFO: Connected to HSQL Database Engine version 2.2 using JDBC driver HSQL Database Engine Driver version 2.3.0. 
May 26, 2014 6:03:58 AM org.apache.openejb.core.transaction.EjbTransactionUtil handleSystemException
SEVERE: EjbTransactionUtil.handleSystemException: unexpected token: ENGINE {stmnt 45412033 CREATE TABLE OPENJPA_SEQUENCE_TABLE (ID TINYINT NOT NULL, SEQUENCE_VALUE BIGINT, PRIMARY KEY (ID)) ENGINE = innodb} [code=-5581, state=42581]
    <openjpa-2.3.0-nonfinal-1540826-r422266:1542644 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: unexpected token: ENGINE {stmnt 45412033 CREATE TABLE OPENJPA_SEQUENCE_TABLE (ID TINYINT NOT NULL, SEQUENCE_VALUE BIGINT, PRIMARY KEY (ID)) ENGINE = innodb} [code=-5581, state=42581]
        at org.apache.openjpa.jdbc.meta.MappingTool.record(MappingTool.java:559)
        at org.apache.openjpa.jdbc.meta.MappingTool.record(MappingTool.java:455)
        at org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.synchronizeMappings(JDBCBrokerFactory.java:160)
        at org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.synchronizeMappings(JDBCBrokerFactory.java:164)
        at org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.newBrokerImpl(JDBCBrokerFactory.java:122)
        at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:209)
        at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:155)
        at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:226)
        at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:59)
        at org.apache.openejb.assembler.classic.ReloadableEntityManagerFactory.createEntityManager(ReloadableEntityManagerFactory.java:159)
        at org.apache.openejb.persistence.JtaEntityManagerRegistry.getEntityManager(JtaEntityManagerRegistry.java:115)
        at org.apache.openejb.persistence.JtaEntityManager.getEntityManager(JtaEntityManager.java:91)
        at org.apache.openejb.persistence.JtaEntityManager.persist(JtaEntityManager.java:137)
        at edu.neumont.pro280.managers.UserManager.createUser(UserManager.java:66)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:182)
        at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:164)
        at org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:180)
        at org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:99)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:182)
        at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:164)
        at org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:80)
        at org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:212)
        at org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:181)
        at org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:268)
        at org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:263)
        at org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:86)
        at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:303)
        at edu.neumont.pro280.managers.UserManager$$LocalBeanProxy.createUser(edu/neumont/pro280/managers/UserManager.java)
        at edu.neumont.pro280.servlets.SignupServlet.doPost(SignupServlet.java:56)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
        at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)
    Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: unexpected token: ENGINE {stmnt 45412033 CREATE TABLE OPENJPA_SEQUENCE_TABLE (ID TINYINT NOT NULL, SEQUENCE_VALUE BIGINT, PRIMARY KEY (ID)) ENGINE = innodb} [code=-5581, state=42581]
        at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:219)
        at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:203)
        at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$700(LoggingConnectionDecorator.java:59)
        at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingStatement.executeUpdate(LoggingConnectionDecorator.java:914)
        at org.apache.openjpa.lib.jdbc.DelegatingStatement.executeUpdate(DelegatingStatement.java:118)
        at org.apache.openjpa.jdbc.schema.SchemaTool.executeSQL(SchemaTool.java:1231)
        at org.apache.openjpa.jdbc.schema.SchemaTool.createTable(SchemaTool.java:976)
        at org.apache.openjpa.jdbc.schema.SchemaTool.add(SchemaTool.java:552)
        at org.apache.openjpa.jdbc.schema.SchemaTool.add(SchemaTool.java:364)
        at org.apache.openjpa.jdbc.schema.SchemaTool.run(SchemaTool.java:341)
        at org.apache.openjpa.jdbc.meta.MappingTool.record(MappingTool.java:505)
        ... 58 more

    May 26, 2014 6:03:58 AM org.apache.catalina.core.StandardWrapperValve invoke
    SEVERE: Servlet.service() for servlet [edu.neumont.pro280.servlets.SignupServlet] in context with path [/TrivItUp1] threw exception
    javax.ejb.EJBException: The bean encountered a non-application exception; nested exception is: 
        <openjpa-2.3.0-nonfinal-1540826-r422266:1542644 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: unexpected token: ENGINE {stmnt 45412033 CREATE TABLE OPENJPA_SEQUENCE_TABLE (ID TINYINT NOT NULL, SEQUENCE_VALUE BIGINT, PRIMARY KEY (ID)) ENGINE = innodb} [code=-5581, state=42581]
        at org.apache.openejb.core.ivm.BaseEjbProxyHandler.convertException(BaseEjbProxyHandler.java:403)
        at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:307)
        at edu.neumont.pro280.managers.UserManager$$LocalBeanProxy.createUser(edu/neumont/pro280/managers/UserManager.java)
        at edu.neumont.pro280.servlets.SignupServlet.doPost(SignupServlet.java:56)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
        at org.apache.tomee.catalina.OpenEJBValve.invoke(OpenEJBValve.java:45)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)
    Caused by: <openjpa-2.3.0-nonfinal-1540826-r422266:1542644 nonfatal general error> org.apache.openjpa.persistence.PersistenceException: unexpected token: ENGINE {stmnt 45412033 CREATE TABLE OPENJPA_SEQUENCE_TABLE (ID TINYINT NOT NULL, SEQUENCE_VALUE BIGINT, PRIMARY KEY (ID)) ENGINE = innodb} [code=-5581, state=42581]
        at org.apache.openjpa.jdbc.meta.MappingTool.record(MappingTool.java:559)
        at org.apache.openjpa.jdbc.meta.MappingTool.record(MappingTool.java:455)
        at org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.synchronizeMappings(JDBCBrokerFactory.java:160)
        at org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.synchronizeMappings(JDBCBrokerFactory.java:164)
        at org.apache.openjpa.jdbc.kernel.JDBCBrokerFactory.newBrokerImpl(JDBCBrokerFactory.java:122)
        at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:209)
        at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:155)
        at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:226)
        at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:59)
        at org.apache.openejb.assembler.classic.ReloadableEntityManagerFactory.createEntityManager(ReloadableEntityManagerFactory.java:159)
        at org.apache.openejb.persistence.JtaEntityManagerRegistry.getEntityManager(JtaEntityManagerRegistry.java:115)
        at org.apache.openejb.persistence.JtaEntityManager.getEntityManager(JtaEntityManager.java:91)
        at org.apache.openejb.persistence.JtaEntityManager.persist(JtaEntityManager.java:137)
        at edu.neumont.pro280.managers.UserManager.createUser(UserManager.java:66)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:182)
        at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:164)
        at org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:180)
        at org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:99)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:182)
        at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:164)
        at org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:80)
        at org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:212)
        at org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:181)
        at org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:268)
        at org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:263)
        at org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:86)
        at org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:303)
        ... 24 more
    Caused by: org.apache.openjpa.lib.jdbc.ReportingSQLException: unexpected token: ENGINE {stmnt 45412033 CREATE TABLE OPENJPA_SEQUENCE_TABLE (ID TINYINT NOT NULL, SEQUENCE_VALUE BIGINT, PRIMARY KEY (ID)) ENGINE = innodb} [code=-5581, state=42581]
        at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:219)
        at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.wrap(LoggingConnectionDecorator.java:203)
        at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator.access$700(LoggingConnectionDecorator.java:59)
        at org.apache.openjpa.lib.jdbc.LoggingConnectionDecorator$LoggingConnection$LoggingStatement.executeUpdate(LoggingConnectionDecorator.java:914)
        at org.apache.openjpa.lib.jdbc.DelegatingStatement.executeUpdate(DelegatingStatement.java:118)
        at org.apache.openjpa.jdbc.schema.SchemaTool.executeSQL(SchemaTool.java:1231)
        at org.apache.openjpa.jdbc.schema.SchemaTool.createTable(SchemaTool.java:976)
        at org.apache.openjpa.jdbc.schema.SchemaTool.add(SchemaTool.java:552)
        at org.apache.openjpa.jdbc.schema.SchemaTool.add(SchemaTool.java:364)
        at org.apache.openjpa.jdbc.schema.SchemaTool.run(SchemaTool.java:341)
        at org.apache.openjpa.jdbc.meta.MappingTool.record(MappingTool.java:505)
        ... 58 more

持久性.xml:

   <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="1.0"
           xmlns="http://java.sun.com/xml/ns/persistence"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
           http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

      <persistence-unit name="UserService" transaction-type="JTA">
        <class>edu.neumont.pro280.models.User</class>
        <properties>
      <property name="openjpa.jdbc.DBDictionary" value="mysql"/>
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
          <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
                <property name="javax.persistence.jdbc.url" value="jdbc:mysql://mywebsite.com:3306/trivitup" />
                <property name="javax.persistence.jdbc.user" value="trivitup" />
                <property name="javax.persistence.jdbc.password" value="password*emphasized text*" />

        </properties>
      </persistence-unit>
    </persistence>

这是我的实体:

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    @Column(name = "id")
    private int id;

    @Column(name = "username")
    private String username;

    @Column(name = "email")
    private String email;

    @Column(name = "password")
    private String password;

    @Column(name = "q_amount_correct", nullable = true)
    private int qAmountCorrect;

    @Column(name = "top_ten_perc", nullable = true)
    private int topTenPerc;

    @Column(name = "confidence_level", nullable = true)
    private double confidenceLevel;

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String user) {
        username = user;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String pass) {
        this.password = pass;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public User() {
    }

    public void setQAmountCorrect(int qAmountCorrect) {
        this.qAmountCorrect = qAmountCorrect;
    }

    public int getQAmountCorrect() {
        return qAmountCorrect;
    }

    public void setTopTenPerc(int topTenPerc) {
        this.topTenPerc = topTenPerc;
    }

    public int getTopTenPerc() {
        return topTenPerc;
    }

    public void setConfidenceLevel(double confidenceLevel) {
        this.confidenceLevel = confidenceLevel;
    }

    public double getConfidenceLevel() {
        return confidenceLevel;
    }
}

感谢您的阅读

最佳答案

您需要在标签中指定数据源。它的值将匹配容器数据源(tomee.xml、容器属性或其他)。您使用的 javax.persistence 属性不适用于 JTA 持久单元,而仅适用于资源本地单元。

关于mysql - 如何使用TomEE plus和JPA连接并查询数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23867020/

相关文章:

php - MySQL 选择查询后的前 5 行

mysql - 为什么这个 SQL 注入(inject) 'sleep' 攻击是有效的拒绝服务?

sql - 预约系统设计

sql - 使用 group by 时出错

java - 使用 hibernate 将三个表合并为一个表

mysql - 我的 api 响应在前端未定义

php - 当meta_key有多个序列化值时get_users()

java - 从数据库中检索图像并显示在标签中

java - PersistenceUnitUtil 中 isLoaded(Object) 方法的用法

java - 为拥有的实体解耦服务的设计模式是什么?