netbeans 自动生成的Java ee应用程序未连接到PostgreSQL

332nm8kg  于 2022-11-10  发布在  Java
关注(0)|答案(1)|浏览(131)

我已经用NetBeans 11.2创建了一个Web应用程序。这个IDE可以自动从DB表生成java类。我尝试使用这个特性,并从我的数据库的表CLIENTS中得到了文件Clients.javaClientsController.javaClientsFacade.java,该数据库运行在本地PostgreSQL服务器上。这些java文件用于向表中添加记录、从表中删除记录、列出记录等。我知道了,没关系。
ClientsFacade.java看起来像这样:

package com.simplebank.web;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

@Stateless
public class ClientsFacade extends AbstractFacade<Clients> {

    @PersistenceContext(unitName = "my_persistence_unit")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public ClientsFacade() {
        super(Clients.class);
    }

}

据我所知,参数"my_persistence_unit"指向某个JDBC连接。我在我的项目中找到了persistence.xml文件,其中也提到了此参数,并编辑了它:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2" xmlns="http://java.sun.com/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">
  <!-- Define Persistence Unit -->
  <persistence-unit name="my_persistence_unit">
    <class>com.simplebank.web.Accounts</class>
    <class>com.simplebank.web.Clients</class>
    <properties>
      <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/student"/>
      <property name="javax.persistence.jdbc.user" value="student"/>
      <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
      <property name="javax.persistence.jdbc.password" value="some-password"/>
    </properties>
  </persistence-unit>
</persistence>

JDBC-connection的所有参数都是正确的,我保证这一点。但是在构建项目之后,我尝试在GlassFish服务器中打开facelet clients/List.xhtml,并收到错误消息:

javax.ejb.EJBException
    at com.sun.ejb.containers.EJBContainerTransactionManager.processSystemException(EJBContainerTransactionManager.java:728)
    at com.sun.ejb.containers.EJBContainerTransactionManager.completeNewTx(EJBContainerTransactionManager.java:678)
    at com.sun.ejb.containers.EJBContainerTransactionManager.postInvokeTx(EJBContainerTransactionManager.java:483)
    at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4576)
    at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2084)

...

Caused by: javax.persistence.PersistenceException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.4.v20190115-ad5b7c6b2a): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.SQLSyntaxErrorException: Schema 'STUDENT' does not exist
Error Code: 30000
Call: SELECT id AS a1, family AS a2, name AS a3, pass_number AS a4, pass_series AS a5 FROM clients OFFSET ? ROWS FETCH NEXT ? ROWS ONLY 
    bind => [2 parameters bound]
Query: ReadAllQuery(referenceClass=Clients sql="SELECT id AS a1, family AS a2, name AS a3, pass_number AS a4, pass_series AS a5 FROM clients OFFSET ? ROWS FETCH NEXT ? ROWS ONLY ")
    at org.eclipse.persistence.internal.jpa.QueryImpl.getDetailedException(QueryImpl.java:391)
    at org.eclipse.persistence.internal.jpa.QueryImpl.executeReadQuery(QueryImpl.java:264)
    at org.eclipse.persistence.internal.jpa.QueryImpl.getResultList(QueryImpl.java:482)
    at com.simplebank.www.AbstractFacade.findRange(AbstractFacade.java:53)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

...

再来一次:模式STUDENT确实(!)存在。我可以使用psql实用程序(PGPASSWORD="blah-blah" psql -U student)查看它和其中的所有表。此外,我还编写了简单的java程序,它使用传统方式(JDBC驱动程序)连接到DB,并且运行良好。此外,当GlassFish服务器启动时,我在调试区域中看到以下行:

" EclipseLink, version: Eclipse Persistence Services - 2.7.4.v20190115-ad5b7c6b2a|#]
  /file:/home/3f-lab/_ide/NETBEANS/web/target/web-1.0/WEB-INF/classes/_my_persistence_unit login successful|#]"

但是facelet不起作用。请解释我做错了什么。

xiozqbni

xiozqbni1#

我已经自己解决了这个问题。原因是(IMHO)在默认连接池中,它在GlassFish(或NetBeans?)中设置为DerbyDB连接。我已经添加了新的连接池,与我的PostgreSQL数据库相关,在GlassFish管理控制台中更改了默认值,我的Web应用程序现在可以正常工作了。我可以查看和编辑表和记录了。

相关问题