Я совершенно новичок в 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, который является чувствительным к регистру именем сущности, поэтому я не вижу, как это связано с моей проблемой.