首页 > 解决方案 > java.sql.SQLSyntaxErrorException:用户缺少权限或找不到对象:

问题描述

在得到一个 JDBC 数据源工作正常的 servlet 之后,我现在正在尝试连接一个 JPA 配置。在这样做的过程中,我翻阅了数百篇文章和手册,并尝试了不同的方法,但每次都回到主题中提到的同一个异常:

java.sql.SQLSyntaxErrorException:用户缺少权限或找不到对象:MUSICIAN

如前所述,我尝试了多种不同的配置,但这是我目前拥有的。我有两个不同的 servlet。我将描述第一个,因为我在第二个同样的问题上遇到了同样的错误。

哦 - TomEE Plume 7.0.2、Oracle JDK 1.8.0_181、MariaDB 10.3.8。

首先,我的音乐家课:

package gym;

...imports omitted for brevity...

@Entity
@Table(name="musician")
public class Musician {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="musician_id")
    private int musician_id;

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

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

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

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

    public Musician() {
    }
    ... getters/setters omitted for brevity...
}

这是servlet代码:

package gym;

... imports left out for brevity...

public class GymJPAServlet extends HttpServlet {

    @PersistenceContext(name="gymPU",unitName="gymPU")
    EntityManager em;

    @Override
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        StringBuilder es = new StringBuilder();

        es.append("Entity Manager Stuff: " + em.toString() + "<br/><br/>");
        es.append("Entity Manager Contains: " + em.contains(gym.Musician.class) + "<br/><br/>");
        Set entities = em.getMetamodel().getEntities();
        es.append("Entities: " + entities + "<br/><br/>");

        ArrayList results = new ArrayList();
        try {
            Musician m = em.find(Musician.class, 1);
            es.append("found it : " + m + "<br/><br/>");
        } catch (Exception e) {
            ... nonessential exception handling code omitted for brevity
        }
        if (results != null) {
            for (Iterator i = results.iterator(); i.hasNext(); ) {
                Musician m = (Musician)(i.next());
                es.append("musician: " + m.toString() + "<br/><br/>");
            }
        } else {
            es.append(es.toString());
        }

        out.write("<html><head></head><body>\n");
        out.write(es.toString());
        out.write("</body></html>\n");

    }
}

我的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">

  <persistence-unit name="gymPU" transaction-type="JTA">
    <jta-data-source>jdbc/GymDS</jta-data-source>
    <non-jta-data-source>jdbc/Gym</non-jta-data-source>
    <class>gym.Musician</class>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="openjpa.jdbc.SynchronizeMappings"
                value="buildSchema(ForeignKeys=true)"/>
    </properties>
  </persistence-unit>

</persistence>

我的 WEB-INF/resources.xml:

<Resource id="jdbc/GymDS" type="javax.sql.DataSource">
    accessToUnderlyingConnectionAllowed = false
    alternateUsernameAllowed = false
    defaultAutoCommit = true
    ignoreDefaultValues = false
    initialSize = 0
    jdbcDriver = org.mariadb.jdcbc.Driver
    jdbcUrl = jdbc:mariadb://localhost:3306/gym
    jtaManaged = true
    maxActive = 20
    maxIdle = 20
    maxOpenPreparedStatements = 0
    maxWaitTime = 10000
    minEvictableIdleTime = 30 minutes
    minIdle = 0
    numTestsPerEvictionRun = 3
    password = mypassword
    passwordCipher = PlainText
    poolPreparedStatements = false
    testOnBorrow = true
    testOnReturn = false
    testWhileIdle = false
    timeBetweenEvictionRuns = -1 millisecond
    userName = gymadmin
</Resource>

最后,我的 context.xml 供非 jta ds 参考:

<Context>
  <Resource
    name="jdbc/Gym"
    auth="Container"
    type="javax.sql.DataSource"
    maxTotal="100"
    maxIdle="30"
    maxWaitMillis="10000"
    username="gymadmin" password="mypassword"
    driverClassName="org.mariadb.jdbc.Driver"
    url="jdbc:mariadb://localhost:3306/gym"/>
</Context>

所以另一端是 MariaDB 实例。我可以使用没有 JPA 的直接 JDBC 从同一个容器中的 servlet 很好地连接到它。这很重要,因为我觉得这一切都说明我的 JPA 设置中的某些东西没有正确连接,因此“找不到对象”是它无法在内部 JPA 设置中找到它,而不是在另外一端。TomEE 日志中的线索强化了我的观点。

我尝试创建一个单独的 MusicianDAO 无状态 bean 的另一个 servlet,但它给了我同样的异常。因此,除非以后有必要,否则我不会通过显示第二个 servlet 代码来详细说明这篇文章。

以下是我的 tomee 日志中的线索。部署应用程序时,我得到:

2019 年 3 月 19 日 15:42:15.727 INFO [localhost-startStop-13] org.apache.openejb.config.ConfigurationFactory.configureApplication 配置企业应用程序:/home/omadmin/tomeeapps/webapps/gym-0.1.1-dev 19 -Mar-2019 15:42:15.917 INFO [localhost-startStop-13] org.apache.openejb.config.ConfigurationFactory.configureService 配置服务(id=gym-0.1.1-dev/jdbc/Gym,type=Resource,provider -id=ProvidedByTomcat)2019 年 3 月 19 日 15:42:15.919 信息 [localhost-startStop-13] org.apache.openejb.assembler.classic.Assembler.createRecipe 创建资源(id=gym-0.1.1-dev/jdbc /Gym) 2019 年 3 月 19 日 15:42:15.924 信息 [localhost-startStop-13] org.apache.openejb.config.AutoConfig.processResourceRef 自动链接资源参考 'jdbc/Gym' 在 beangym-0.1.1 -dev.Comp1022583414 到资源(id=jdbc/Gym)2019 年 3 月 19 日 15:42:15。925 INFO [localhost-startStop-13] org.apache.openejb.config.AutoConfig.processResourceRef 自动链接资源-ref 'openejb/Resource/gym-0.1.1-dev/jdbc/Gym' 在 beangym-0.1.1 -dev.Comp1022583414 到 Resource(id=gym-0.1.1-dev/jdbc/Gym) 19-Mar-2019 15:42:15.925 INFO [localhost-startStop-13] org.apache.openejb.config.AutoConfig.processResourceRef将 bean gym-0.1.1-dev.Comp1022583414 中的资源引用“openejb/Resource/jdbc/Gym”自动链接到 Resource(id=gym-0.1.1-dev/jdbc/Gym) 19-Mar-2019 15: 42:15.925 信息 [localhost-startStop-13] org.apache.openejb.config.AutoConfig.deploy 配置 PersistenceUnit(name=gymPU) 19-Mar-2019 15:42:15.926 警告 [localhost-startStop-13] org.apache .openejb.config.AutoConfig.deploy 找到匹配的数据源:gym-0.1.1-dev/jdbc/Gym 但这是一个 JTA 数据源 19-Mar-2019 15:42:15.926 WARNING [localhost-startStop-13] org.apache.openejb.config.AutoConfig.deploy 找到匹配的数据源:gym-0.1.1-dev/jdbc/Gym 但这是一个 JTA 数据源 19-Mar-2019 15 :42:15.926 WARNING [localhost-startStop-13] org.apache.openejb.config.AutoConfig.deploy 找到匹配的数据源:gym-0.1.1-dev/jdbc/Gym 但这是一个 JTA 数据源 2019 年 3 月 19 日 15:42:15.927 信息 [localhost-startStop-13] org.apache.openejb.config.AutoConfig.setJtaDataSource 将 PersistenceUnit gymPU 调整为来自“jdbc/GymDS”的资源 ID“默认 JDBC 数据库” 19-Mar- 2019 15:42:15.931 信息 [localhost-startStop-13] org.apache.openejb.config.AutoConfig.setNonJtaDataSource 将 PersistenceUnit gymPU 调整为来自“jdbc/Gym”的资源 ID“默认非托管 JDBC 数据库”2019 年 3 月 19 日 15:42:15.936 信息 [localhost-startStop-13] org.apache.openejb.config.AppInfoBuilder.build 企业应用程序“/home/omadmin/tomeeapps/webapps/gym-0.1.1-dev”已加载. 2019 年 3 月 19 日 15:42:15.937 信息 [localhost-startStop-13] org.apache.openejb.assembler.classic.Assembler.createApplication 组装应用程序:/home/omadmin/tomeeapps/webapps/gym-0.1.1-dev 2019 年 3 月 19 日 15:42:15.975 信息 [localhost-startStop-13] org.apache.openejb.assembler.classic.ReloadableEntityManagerFactory.createDelegate PersistenceUnit(name=gymPU, provider=org.eclipse.persistence.jpa.PersistenceProvider) -提供者时间 29 毫秒 2019 年 3 月 19 日 15:42:16.043 信息 [localhost-startStop-13] org.apache.tomee.catalina.TomcatWebAppBuilder.deployWebApps 使用上下文文件 /home/omadmin/tomeeapps/webapps/gym-0.1.1-开发/元信息/上下文。 [EL信息]:2019-03-19 15:43:47.499--ServerSession(1356468468)--/file:/home/omadmin/tomeeapps/webapps/gym-0.1.1-dev/_gymPU登录成功[EL警告] : 2019-03-19 15:43:47.506--ServerSession(1356468468)--注册 MBean 时出现问题:java.lang.NullPointerException [EL 警告]:2019-03-19 15:43:47.51--UnitOfWork(570034438) --Exception [EclipseLink-4002](Eclipse Persistence Services - 2.6.3.v20160428-59c81c5):org.eclipse.persistence.exceptions.DatabaseException 内部异常:java.sql.SQLSyntaxErrorException:用户缺少权限或找不到对象:MUSICIAN 错误代码:-5501调用:SELECT music_id,biography,namefirst,namelast,昵称 FROM music WHERE (musician_id = ?) bind => [1 parameter bound] 查询:ReadObjectQuery(name="readMusician" referenceClass=Musician sql="SELECT music_id, biography, namefirst, namelast,来自音乐家的昵称 WHERE (musician_id = ?)")

所以.. 作为一个完整的 JEE 菜鸟,我能想到的最好的办法是,在我看来,配置文件中仍然没有正确连接的东西,因此,它消除了我的gymDS数据source 并用一些默认的内部数据库表示替换它,然后在进行数据库调用时,当然它无法在数据库“默认 JDBC 数据库”的这个替代现实版本中找到 MUSICIAN 对象,如上面的日志片段所示。

“文件:...登录成功”的事情也很可疑,但我怀疑这是前面提到的问题的副作用。

注意我还没有对全局 tomee.xml 做任何事情,因为我试图在应用程序本地而不是全局上执行此操作。我提到这一点是因为我读到的一些东西似乎表明我可能无论如何都需要触摸那个文件,但我还没有到那个地步。

无论如何,我不知道还能尝试什么。我还没有尝试过不同的容器,但也许我需要在不同的 JEE 系统(如 OpenLiberty)下启动所有这些,看看是否会发生同样的事情。

与此同时,任何人都可以解释一下吗?它必须是一些简单的东西,我在这里或那里缺少的一个字段,或者我的 persistence.xml 位于错误的位置,什么...???

标签: javamariadbjava-ee-7tomee-7

解决方案


推荐阅读