我已经用NetBeans 11.2创建了一个Web应用程序。这个IDE可以自动从DB表生成java类。我尝试使用这个特性,并从我的数据库的表CLIENTS
中得到了文件Clients.java
、ClientsController.java
和ClientsFacade.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不起作用。请解释我做错了什么。
1条答案
按热度按时间xiozqbni1#
我已经自己解决了这个问题。原因是(IMHO)在默认连接池中,它在GlassFish(或NetBeans?)中设置为DerbyDB连接。我已经添加了新的连接池,与我的PostgreSQL数据库相关,在GlassFish管理控制台中更改了默认值,我的Web应用程序现在可以正常工作了。我可以查看和编辑表和记录了。