Как правильно настроить JPA с Intellj для базы данных postgresql и провайдера персистентности оракула, чтобы избавиться от исключений времени выполнения? - PullRequest
0 голосов
/ 04 июля 2019

Я совершенно новичок в JPA и пытаюсь использовать инструменты, предоставляемые моим университетом.Итак, я пытаюсь создать базу данных carsdb с одной таблицей car и читать таблицу из моей главной страницы с помощью запроса JPQL.

Что я сделал до сих пор: я создал пользователя carsdbuser с паролем carsdbpwсоздал базу данных postgres carsdb, которой владеет carsdbuser, добавил таблицу car и вставил несколько столбцов.

Я создал новый проект Intellij с JPA.

Затем я добавил postgresql jdbc.драйверы (я думаю ... файл был передан нам университетом) postgresql-42.2.1.jar, а также провайдер oracle eclipslink.jar.

Затем я изменил файл persistence.xml так, чтобы он выглядел какthis:

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

<persistence-unit name="carsdb" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>Car</class>
    <properties>
        <property name="eclipselink.jdbc.url" value="jdbc:postgresql://localhost:5432/carsdb"/>
        <property name="eclipselink.jdbc.driver" value="org.postgresql.Driver"/>
        <property name="eclipselink.jdbc.user" value="carsdbuser"/>
        <property name="eclipselink.jdbc.password" value="carsdbpw"/>
        <property name="eclipselink.target-database" value="PostgreSQL"/>
        <property name="eclipselink.logging.level" value="ALL"/>
    </properties>
</persistence-unit>
</persistence>

Я создал Class Car.java:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "car")
public class Car {

    @Id
    @GeneratedValue(generator = "incrementor")
    private int Id;

    public int getId() {
        return Id;
    }

    public void setId(int id) {
        Id = id;
    }
    private String Name;

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }

    @Override
    public String toString() {
        return "Car " + Id + ": Name: " + Name;
    }
}

, а также Main:

import javax.persistence.*;
import java.util.List;

public class Main {
    public static void main(String[] args){
        var factory = Persistence.createEntityManagerFactory("carsdb");
        EntityManager em = factory.createEntityManager();

        Query query = em.createQuery("select a from Car a");
        List<Car> list = query.getResultList();
        for (Car c : list) {
            System.out.println(c);
        }
    }
}

Учитывая учебники, я следую этомувыглядит хорошо для меня, однако, когда я запускаю программу, я получаю следующее сообщение об ошибке:

Exception in thread "main" java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Problem compiling [select a from Car a]. 
[14, 17] The abstract schema type 'Car' is unknown.
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1743)
    at Main.main(Main.java:9)
Caused by: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.7.1.v20171221-bd47e8f): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Problem compiling [select a from Car a]. 
[14, 17] The abstract schema type 'Car' is unknown.
    at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildException(HermesParser.java:155)
    at org.eclipse.persistence.internal.jpa.jpql.HermesParser.validate(HermesParser.java:347)
    at org.eclipse.persistence.internal.jpa.jpql.HermesParser.populateQueryImp(HermesParser.java:278)
    at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildQuery(HermesParser.java:163)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:140)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:116)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:102)
    at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:86)
    at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1741)
    ... 1 more

Я пытался найти некоторые решения с помощью одноклассников и Google, но не нашел решения, которое помогло бы.

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

В следующем Вопросе обсуждается похожая проблема: Ошибка при компиляции запроса: тип абстрактной схемы 'entity' неизвестен

Однако в операторе select у меня есть Car, который является чувствительным к регистру именем сущности, поэтому я не вижу, как это связано с моей проблемой.

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