java.sql.SQLSyntaxErrorException: пользователю не хватает привилегии или объект не найден: - PullRequest
0 голосов
/ 20 марта 2019

После того, как сервлет с источником данных JDBC работает нормально, я сейчас пытаюсь подключить конфигурацию JPA.При этом я пролистал сотни постов и руководств и пробовал разные вещи, и каждый раз все возвращалось к одному и тому же исключению, упомянутому в теме:

java.sql.SQLSyntaxErrorException: пользователю не хватает привилегии илиобъект не найден: MUSICIAN

Как уже упоминалось, я пробовал несколько разных конфигураций, но вот что у меня сейчас.У меня есть два разных сервлета.Я опишу первое, потому что я получаю ту же ошибку на втором, и та же проблема.

Ох - 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...
}

Вот код сервлета:

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.Я могу подключиться к нему просто отлично, используя прямой JDBC без JPA, из сервлетов в том же контейнере.Это важно, потому что я чувствую, что все это сводится к тому, что что-то не подключено прямо в моей настройке JPA, и поэтому «объект не найден» заключается в том, что он не может найти его во внутренней настройке JPA, а не в БД надругой конец.Это подтверждается подсказками из журнала TomEE.

Другой сервлет, который я пытался создать отдельный компонент MusicianDAO без сохранения состояния, но дает мне то же исключение.Поэтому я не буду описывать этот пост, показывая второй код сервлета, если в этом нет необходимости, позже.

Вот подсказки из моего журнала томов.При развертывании приложения я получаю:

19-Mar-2019 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) 19-Mar-2019 15: 42: 15.919 INFO [localhost-startStop-13] org.apache.openejb.assembler.classic.Assembler.createRecipe Создание ресурса (id = gym-0.1.1-dev / jdbc / Gym) 19-Mar-2019 15: 42: 15.924 INFO [localhost-startStop-13] org.apache.openejb.config.AutoConfig.processResourceRef Auto-связать ресурс-ref 'jdbc / Gym' в bean gym-0.1.1-dev.Comp1022583414 с ресурсом (id = jdbc / Gym) 19-Mar-2019 15: 42: 15.925 INFO [localhost-startStop-13] org.apache.openejb.config.AutoConfig.processResourceRef Автоматическое связывание resource-ref 'openejb / Resource / gym-0.1.1-dev / jdbc / Gym 'в bean gym-0.1.1-dev.Comp1022583414 to 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 Автоматическое связывание ресурса-ссылки 'openejb / Resource / jdbc / Gym' в bean gym-0.1.1-dev.Comp1022583414 для ресурса (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 ПРЕДУПРЕЖДЕНИЕ [localhost-startStop-13] org.apache.openejb.config.AutoConfig.deploy Найден соответствующий источник данных: gym-0.1.1-dev / jdbc / Gym, но этот является источником данных JTA 19-Mar-201915: 42: 15.926 ПРЕДУПРЕЖДЕНИЕ [localhost-startStop-13] org.apache.openejb.config.AutoConfig.deploy Найден соответствующий источник данных: gym-0.1.1-dev / jdbc / Gym and thiодин из них - источник данных JTA 19-Mar-2019 15: 42: 15.927 INFO [localhost-startStop-13] org.apache.openejb.config.AutoConfig.setJtaDataSource Настройка PersistenceUnit gymPU на идентификатор ресурса 'JDBC по умолчаниюБаза данных 'из' jdbc / GymDS '19-Mar-2019 15: 42: 15.931 ИНФОРМАЦИЯ [localhost-startStop-13] org.apache.openejb.config.AutoConfig.setNonJtaDataSource Настройка PersistenceUnit gymPU для идентификатора ресурса «Неуправляемая база данных JDBC по умолчанию» из'jdbc / Gym' 19-Mar-2019 15: 42: 15.936 ИНФОРМАЦИЯ [localhost-startStop-13] org.apache.openejb.config.AppInfoBuilder.build Приложение для предприятия "/ home / omadmin / tomeeapps / webapps / gym-0.1.1-dev "загружен.19-Mar-2019 15: 42: 15.937 ИНФОРМАЦИЯ [localhost-startStop-13] org.apache.openejb.assembler.classic.Assembler.createApplication Приложение для сборки: /home/omadmin/tomeeapps/webapps/gym-0.1.1-dev19 марта 2019 г. 15: 42: 15.975 ИНФОРМАЦИЯ [localhost-startStop-13] org.apache.openejb.assembler.classic.ReloadableEntityManagerFactory.createDelegate PersistenceUnit (name = gymPU, provider = org.eclipse.persistence.jpa.PersistenceProviderвремя провайдера 29 мс 19 марта 2019 г. 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 19-Mar-2019 15: 42: 16.046 INFO [localhost-startStop-13] org.apache.openejb.assembler.classic.Assembler.createApplication Развернутое приложение (путь = / home / omadmin /tomeeapps / webapps / gym-0.1.1-dev) 19-Mar-2019 15: 42: 16.308 INFO [localhost-startStop-13] sun.reflect.DelegatingMethodAccessorImpl.invoke Развертывание архива веб-приложений / home / omadmin / tomeeapps / webapps/ тренажерный зал-0.1.1-dev.war завершил работу за 839 мс [EL Info]: 2019-03-19 15: 43: 47.421 - ServerSession (1356468468) - EclipseLink, версия: Eclipse Persistence Services - 2.6.3.v20160428-59c81c5 [EL Info]: 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) - Исключение [EclipseLink-4002] (Eclipse Persistence Services - 2.6.3.v20160428-59c81c5): org.eclipse.persistence.exceptions.DatabaseException Внутреннее исключение: java.sql.SQLSyntaxErrorException: пользователю не хватает привилегии или объект не найден: MUSICIANКод ошибки: -5501 Вызов: SELECT musician_id, биография, имя, имя, фамилия, псевдоним ОТ музыканта WHERE (musician_id =?) Bind => [1 параметр привязан] Запрос: ReadObjectQuery (name = "readMusician" referenceClass = Musician sql ="ВЫБЕРИТЕ музыканта_id, биография, namefirst, namelast, псевдоним FROM музыкант WHERE (musician_id =?) ")

Итак ... будучи здесь полным нубом JEE, лучшее, что я могу придумать, это то, что он кажетсяу меня до сих пор нет чего-то связанного прямо в файлах конфигурации, и поэтому из-за этого он отменяет мой источник данных gymDS и заменяет его некоторым внутренним представлением БД по умолчанию, а затем, когда база данныхвызов сделан, ну конечно он не может найти объект MUSICIAN в этой версии альтернативной реальности базы данных "База данных JDBC по умолчанию", как видно из фрагмента журнала выше.

Файл "Файл":... вход выполнен успешно "тоже подозрительно, но я подозреваю, что это побочный эффект ранее упомянутой проблемы.

ПРИМЕЧАНИЕ также я ничего не сделал с глобальным tomee.xml, потому что я пытался сделать это локальнов приложение, а не глобальное.Я упоминаю об этом, потому что некоторые вещи, которые я читаю, по-видимому, указывают на то, что мне, возможно, нужно в любом случае прикоснуться к этому файлу, но я еще не дошел до этого.

В любом случае, я не знаю, что еще попробовать.Я еще не пробовал другой контейнер, но, возможно, мне нужно раскрутить все это в другой системе JEE, такой как OpenLiberty, чтобы увидеть, происходит ли то же самое.

А пока кто-нибудь может пролить свет?Это должно быть что-то простое, поле, которое я пропускаю здесь или там, или, возможно, мой файл persistence.xml находится в неправильном месте, что-то ... ???

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...