自动生成的Java ee应用程序未连接到PostgreSQL
我已经用NetBeans 11.2创建了一个web应用程序。这个IDE可以从DB表自动生成java类。我尝试使用此功能,并从本地PostgreSQL server上运行的数据库的表自动生成的Java ee应用程序未连接到PostgreSQL,postgresql,jpa,netbeans,Postgresql,Jpa,Netbeans,我已经用NetBeans 11.2创建了一个web应用程序。这个IDE可以从DB表自动生成java类。我尝试使用此功能,并从本地PostgreSQL server上运行的数据库的表Clients中获取了文件Clients.java、ClientsController.java和ClientsFacade.java。这些java文件用于在表中添加、删除记录,列出记录等等,我已经知道了,没关系 ClientsFacade.java如下所示: package com.simplebank.web; 导
Clients
中获取了文件Clients.java
、ClientsController.java
和ClientsFacade.java
。这些java文件用于在表中添加、删除记录,列出记录等等,我已经知道了,没关系
ClientsFacade.java
如下所示:
package com.simplebank.web;
导入javax.ejb.Stateless;
导入javax.persistence.EntityManager;
导入javax.persistence.PersistenceContext;
@无国籍
公共类ClientsFacade扩展了AbstractFacade{
@PersistenceContext(unitName=“my_persistence_unit”)
私人实体管理者;
@凌驾
受保护的EntityManager getEntityManager(){
返回em;
}
公共客户端facade(){
超级(Clients.class);
}
}
据我所知,参数“my_persistence_unit”指向某个JDBC连接。我在我的项目中找到了persistence.xml
文件,其中也提到了此参数,并对其进行了编辑:
com.simplebank.web.Accounts
com.simplebank.web.Clients
JDBC连接的所有参数都是正确的,我保证这一点。但在构建项目后,我尝试在GlassFish服务器中打开faceletclients/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)
...
再来一次:schema STUDENT不存在(!)。我可以使用psql
实用程序(PGPASSWORD=“blah blah”psql-U student
)查看它和其中的所有表格。我还编写了一个简单的java程序,用传统的方式(JDBC驱动程序)连接到数据库,运行良好。此外,当GlassFish服务器启动时,我在调试区域看到一行:
/file:/home/3f-lab/_ide/NETBEANS/web/target/web-1.0/WEB-INF/classes/_my_persistence_unit login successful|#]"
但facelet不起作用。请给我解释一下我做错了什么。我自己解决了这个问题。原因是默认连接池中的(IMHO),该连接池在GlassFish(或在NetBeans?)中设置为DerbyDB连接。我已经添加了与我的PostgreSQL数据库相关的新连接池,在GlassFish管理控制台中更改了默认值,我的web应用程序现在可以正常工作了。我可以查看和编辑表和记录。检查jdbc url中提供的数据库名称是否正确,以及检查学生表是否位于其他模式中(而不是使用postgresql数据库时位于公共模式中),url是否绝对正确<代码>jdbc:postgresql://localhost:5432/student。现在“student”既是模式名又是表名。有这样一个模式名是很奇怪的。通常,它有一个更通用的名称,如“companyname”或“default”。尝试
jdbc:p的URLostgresql://localhost:5432
。这根本不是JSF的问题,所以我删除了JSF标记。@BalusC:URL中的student
指的是具有该名称的数据库,而不是模式。“JDBC连接的所有参数都是正确的,我保证这一点”-所以您创建了一个名为student
的数据库?伙计们,我尝试了许多不同的数据库名称,模式和用户。例如,在开始的数据库中命名为bank
、schemapublic
和userstudent
。不管这些名称如何,结果总是一样的:连接通过简单的JDBC
和psql
实用程序工作,但在GlassFish中不起作用。最后,为了简单起见,我命名了所有三个参数(db、use和schema)student
(Postgres包含相关对象),但错误再次出现。