首页 > 解决方案 > 为什么我的代码在尝试从 Postgres 读取时无法识别任何实体?

问题描述

eclipse中的文件夹结构

Ansatt 表示员工,Brukernavn 表示用户名。仅供参考,在挪威语中。

我正在学习我的讲师给我们的关于如何连接到 Postgres 服务器的简短教程。我在 Postgres 中创建了一个新的模式/表,并添加了一个测试字段来查看我的 java 代码是否有效。主类中的简单方法应该打印出从 sql 脚本添加的数据库中的两个字段。但是,当我尝试从 Postgres 获取此测试信息时收到一条错误消息。我的代码搜索和识别实体的方式有问题。就我而言,安萨特,但我不知道是什么。

打印 id 和 brukernavn(username) 的主要方法和方法:

package oblig3;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class KommunisereMedDatabaseEnklere {

    public static void main(String[] args) {

        Ansatt a = finnAnsattMedId(101);

        System.out.println(a);
    }

    public static Ansatt finnAnsattMedId(int id) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("AnsattPersistenceUnit");
        EntityManager em = emf.createEntityManager();
        Ansatt a = null;

        try {
            a = em.find(Ansatt.class, id);
        } finally {
            em.close();
        }
        return a;
    }


}

xml 文件,认为问题一定出在某处:

<?xml version ="1.0"encoding="UTF-8"?>

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
    http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
    version="2.2">

    <persistence-unit name="AnsattPersistenceUnit" transaction-type="RESOURCE_LOCAL">
        <class>oblig3.Ansatt</class>
        <properties>
            <!--GenerelleJPA properties -->
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
            <property name="javax.persistence.jdbc.url"
            value="jdbc:postgresql://*******/*******" />
            <property name="javax.persistence.jdbc.user" value="*******"/>
            <property name="javax.persistence.jdbc.password" value="*******"/>

            <!--EclipseLink properties -->
            <!--Sehttps://wiki.eclipse.org/EclipseLink/Examples/JPA/Logging -->
            <property name="eclipselink.logging.level" value="WARNING"/>
        </properties>

    </persistence-unit>

</persistence>

在数据库中用作@Entity 的类:

package oblig3;

import javax.persistence.*;

@Entity
@Table (name = "Ansatt", schema = "oblig3_jpa")
@NamedQuery (name = "hentAlleAnsatte", query = "SELECT a FROM Ansatt a")

public class Ansatt {
    @Id private int id; 
        private String brukernavn;

    public Ansatt() {
    }

    public Ansatt(int id, String brukernavn) {
        this.id = id;
        this.brukernavn = brukernavn;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setBrukernavnd(String brukernavn) {
        this.brukernavn = brukernavn;
    }

    public String getBrukernavn() {
        return brukernavn;
    }


}

我用来在 postgres 中创建表和模式的 sql 命令:


DROP SCHEMA IF EXISTS oblig3_jpa CASCADE;

CREATE SCHEMA oblig3_jpa;
SET search_path to oblig3_jpa;

CREATE TABLE Ansatt
(
   id       INT,
   brukernavn   VARCHAR(4),
   PRIMARY KEY (id)
);

insert into Ansatt (id, brukernavn)
values (101, 'spsh')

该代码应该在控制台上打印这样的内容: [101, spsh]

我得到:[EL 警告]:元模型:2019-04-08 19:37:17.834--元模型类型的集合是空的。在对 Java SE 和某些 Java EE 容器管理的持久性单元进行实体搜索期间,可能未找到模型类。请验证您的实体类是否在persistence.xml中使用元素或全局错误元素在线程“main”java.lang.IllegalArgumentException中引用异常:未知实体bean类:类oblig3.Ansatt,请验证该类已被标记带有@Entity 注释。

在 org.eclipse.persistence.internal.jpa.EntityManagerImpl.find(EntityManagerImpl.java:810)

在 org.eclipse.persistence.internal.jpa.EntityManagerImpl.find(EntityManagerImpl.java:688)

在 oblig3.KommunisereMedDatabaseEnklere.finnAnsattMedId(KommunisereMedDatabaseEnklere.java:22)

在 oblig3.KommunisereMedDatabaseEnklere.main(KommunisereMedDatabaseEnklere.java:11)

标签: javapostgresqljpaorm

解决方案


推荐阅读