JPA使用@NamedQuery指定DB2多Schema报错:Schema.Table不能为FROM子句首个声明
问题根因
Postman返回的EntityManager为空是上层表象,本质是JPA持久化单元jpa-unit启动失败,导致容器无法完成EntityManager的依赖注入。不需要新增orm.xml配置,修改现有配置即可解决问题。
具体修改方案
1. 修复persistence.xml配置
<?xml version="1.0" encoding="UTF-8"?> <persistence version="2.2" 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"> <persistence-unit name="jpa-unit" transaction-type="JTA"> <!-- 新增JTA数据源引用,对应server.xml中配置的JNDI名称 --> <jta-data-source>jdbc/db2</jta-data-source> <!-- 删掉不存在的orm.xml配置行 --> <!-- <mapping-file>orm.xml</mapping-file> --> <properties> <!-- 删掉Hibernate方言配置,OpenLiberty默认使用EclipseLink作为JPA实现,替换为对应DB2方言 --> <property name="eclipselink.target-database" value="DB2"/> <!-- 新增全局默认Schema配置,不需要每个实体单独指定 --> <property name="eclipselink.default-schema" value="SANKOFA"/> <property name="javax.persistence.schema-generation.database.action" value="create" /> <property name="javax.persistence.schema-generation.create-database-schemas" value="true" /> <property name="javax.persistence.schema-generation.scripts.action" value="create" /> <property name="javax.persistence.schema-generation.scripts.create-target" value="create.ddl"/> </properties> </persistence-unit> </persistence>
注意:DB2默认Schema名称为全大写,如果你实际的Schema名是小写的
Sankofa,请自行调整上面的配置值。
2. 修复server.xml数据源配置
你定义的DB2驱动库ID是DB2JCCLib,但数据源中引用的库ID错误,修改jdbcDriver的libraryRef属性即可:
<dataSource id="DefaultDataSource" jndiName="jdbc/db2"> <!-- 把原来的libraryRef="jdbcLib"改成DB2JCCLib --> <jdbcDriver libraryRef="DB2JCCLib"/> <properties.db2.jcc databaseName="testdb" serverName="localhost" portNumber="50000" user="****" password="****" /> </dataSource>
验证
修改完成后重新打包启动OpenLiberty,确认控制台没有CWWJP0015E报错后,再用Postman测试接口即可。
内容的提问来源于stack exchange,提问作者Dylan VR
相关产品推荐
相关产品推荐

