java.sql.SQLSyntaxErrorException:用户缺乏特权或找不到对象:

时间:2019-03-19 21:11:13

标签: java mariadb java-ee-7 tomee-7

使用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设置中找到,而不是在数据库上的db中找到它。另一端。 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 INFO   [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 INFO   [localhost-startStop-13]   org.apache.openejb.config.AutoConfig.processResourceRef自动链接   Bean Gym-0.1.1-dev.Comp1022583414中的resource-ref'jdbc / Gym'   资源(id = jdbc / Gym)2019年3月19日15:42:15.925 INFO   [localhost-startStop-13]   org.apache.openejb.config.AutoConfig.processResourceRef自动链接   bean中的资源引用'openejb / Resource / gym-0.1.1-dev / jdbc / Gym'   Gym-0.1.1-dev.Comp1022583414到Resource(id = gym-0.1.1-dev / jdbc / Gym)   2019年3月19日15:42:15.925 INFO [localhost-startStop-13]   org.apache.openejb.config.AutoConfig.processResourceRef自动链接   bean中的资源引用'openejb / Resource / jdbc / Gym'   Gym-0.1.1-dev.Comp1022583414到Resource(id = gym-0.1.1-dev / jdbc / Gym)   2019年3月19日15:42:15.925 INFO [localhost-startStop-13]   org.apache.openejb.config.AutoConfig.deploy配置   PersistenceUnit(name = gymPU)2019年3月19日15:42:15.926警告   [localhost-startStop-13] org.apache.openejb.config.AutoConfig.deploy   找到匹配的数据源:gym-0.1.1-dev / jdbc / Gym,但这是一个   JTA数据源2019年3月19日15:42:15.926警告   [localhost-startStop-13] org.apache.openejb.config.AutoConfig.deploy   找到匹配的数据源:gym-0.1.1-dev / jdbc / Gym,但这是一个   JTA数据源2019年3月19日15:42:15.926警告   [localhost-startStop-13] org.apache.openejb.config.AutoConfig.deploy   找到匹配的数据源:gym-0.1.1-dev / jdbc / Gym,但这是一个   JTA数据源    2019年3月19日15:42:15.927 INFO [localhost-startStop-13] org.apache.openejb.config.AutoConfig.setJtaDataSource调整   PersistenceUnit gymPU到资源ID'默认JDBC   来自'jdbc / GymDS'的数据库''19-Mar-2019 15:42:15.931 INFO   [localhost-startStop-13]   org.apache.openejb.config.AutoConfig.setNonJtaDataSource调整   PersistenceUnit gymPU到资源ID'默认   来自'jdbc / Gym'的非托管JDBC数据库'' 2019年3月19日15:42:15.936   INFO [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 INFO [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 INFO [localhost-startStop-13]   org.apache.openejb.assembler.classic.ReloadableEntityManagerFactory.createDelegate   PersistenceUnit(name = gymPU,   provider = org.eclipse.persistence.jpa.PersistenceProvider)-提供程序   时间29ms 2019年3月19日15:42:16.043信息[localhost-startStop-13]   org.apache.tomee.catalina.TomcatWebAppBuilder.deployWebApps使用   上下文文件   /home/omadmin/tomeeapps/webapps/gym-0.1.1-dev/META-INF/context.xml   2019年3月19日15:42:16.046 INFO [localhost-startStop-13]   org.apache.openejb.assembler.classic.Assembler.createApplication   已部署   应用程序(路径= / home / omadmin / tomeeapps / webapps / gym-0.1.1-dev)   2019年3月19日15:42:16.308 INFO [localhost-startStop-13]   sun.reflect.DelegatingMethodAccessorImpl.invoke部署Web   应用档案/home/omadmin/tomeeapps/webapps/gym-0.1.1-dev.war   已在839毫秒内完成[EL信息]:2019-03-19   15:43:47.421--ServerSession(1356468468)-EclipseLink,版本:Eclipse   持久性服务-2.6.3.v20160428-59c81c5    [EL信息]:2019-03-19 15:43:47.499--ServerSession(1356468468)-/文件:/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)-异常[EclipseLink-4002]   (Eclipse Persistence Services-2.6.3.v20160428-59c81c5):   org.eclipse.persistence.exceptions.DatabaseException内部   异常:java.sql.SQLSyntaxErrorException:用户缺少特权或   找不到对象:MUSICIAN错误代码:-5501 调用:SELECT   artist_id,传记,姓氏,姓氏,昵称FROM音乐家   WHERE(musician_id =?)bind => [绑定1个参数]查询:   ReadObjectQuery(name =“ readMusician” referenceClass = Musician   sql =“ SELECT artist_id,传记,名字优先,姓氏,昵称FROM   音乐家WHERE(musician_id =?)“)

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

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

注意,我也没有对全局tomee.xml做任何事情,因为我试图在应用程序本地而不是全局进行此操作。我之所以这样说是因为我读过的东西似乎表明我可能仍然需要触摸该文件,但我还没有达到那个程度。

无论如何,我不知道还能尝试什么。我还没有尝试过其他容器,但是也许我需要在不同的JEE系统(例如OpenLiberty)下旋转所有这些,以查看是否发生了相同的事情。

在此同时,任何人都可以阐明一切吗?一定是简单的东西,我在这里或那里缺少的字段,或者我的persistence.xml放在错误的位置,是什么... ???

0 个答案:

没有答案