macOS中的Postgres和JPA

时间:2018-10-13 11:01:57

标签: postgresql macos hibernate jpa wildfly

我在Windows环境中使用Postgres 9.6和Wildfly14。我通过wildfly创建了如下连接:

<datasource jndi-name="java:jboss/datasources/mydb" pool-name="mydb" enabled="true">
    <connection-url>jdbc:postgresql://localhost:5432/mydb</connection-url>
    <driver-class>org.postgresql.Driver</driver-class>
    <datasource-class>org.postgresql.ds.PGSimpleDataSource</datasource-class>
    <driver>postgresql-42.1.1.jar</driver>
    <security>
        <user-name>someusername</user-name>
        <password>somepassword</password>
    </security>
    <validation>
        <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"/>
        <background-validation>true</background-validation>
        <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"/>
    </validation>
</datasource>

然后是我的Persistence.xml,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
   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_1.xsd">
        <persistence-unit name="SomePU" transaction-type="JTA">
           <jta-data-source>java:jboss/datasources/mydb</jta-data-source>
        </persistence-unit>
</persistence>

我的JPA实体看起来像这样:

@Entity @Table(name="usr_apps")
public class SomeApp{...}

我的EJB无状态类:

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

public List getSometing(){
   return em.createQuery("select b from SomeApp b").getResultList(); 
}     

相同的配置在Linux Ubuntu,Linux RHEL,Mac OSX Lion上也可以运行。

但是现在我试图在macOS mojave上运行它,尝试通过JPA读取数据时收到此错误。

[org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (default task-1) ERROR: relation "usr_apps" does not exist
 Position: 150

我很确定该表存在。我可以看到在任何其他DBMS中运行相同的查询。我已经从其他环境中转储了数据库,并将其还原到新环境中。

PS。我也尝试了PSQL10。同样的结果。没有从数据库中读取数据。我可以从Wildfly管理控制台成功ping通连接。

我还确保该表处于公共模式。

编辑

我意识到,即使连接设置为mydb,但JPA只会将查询发送到postgres默认数据库!

编辑2

好,这对我来说已经接近一个错误了。

<datasource jndi-name="java:jboss/datasources/mydb" pool-name="mydb">
                <connection-url>jdbc:postgresql://localhost:5432/mydb</connection-url>
                <driver-class>org.postgresql.Driver</driver-class>
                <datasource-class>org.postgresql.ds.PGSimpleDataSource</datasource-class>
                <driver>postgresql-42.2.5.jar</driver>
                <security>
                    <user-name>testuser</user-name>
                    <password>testpassword</password>
                </security>
                <validation>
                    <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"/>
                    <background-validation>true</background-validation>
                    <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"/>
                </validation>
            </datasource>

我收到此错误:

Caused by: org.postgresql.util.PSQLException: FATAL: database "testuser" does not exist

为什么JPA会将我的用户名当作数据库名称?

PS。狂野14.0.1。最终

1 个答案:

答案 0 :(得分:2)

好!!我要做的就是从连接中删除数据源类:

<datasource-class>org.postgresql.ds.PGSimpleDataSource</datasource-class>

最终使其正常工作

请注意,当您通过管理控制台创建数据源时,wildfly版本14及更高版本会自动将此行添加到xml文件中。