1

这几天我一直在研究这个问题,但没有解决方案。我希望在这里发布我的问题将引导我朝着正确的方向前进。我浏览了许多论坛,并且都说明了我遵循的相同步骤(如下所述),但在访问数据源时仍然遇到相同的运行时异常。

Exception - 
org.hibernate.exception.SQLGrammarException: Could not open connection
at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:122)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
Caused by: java.sql.SQLNonTransientException: [jcc][t4][10205][11234][4.11.88] Null userid is not supported. ERRORCODE=-4461, SQLSTATE=42815 DSRA0010E: SQL-Status = 42815, Fehlercode = -4'461
at com.ibm.db2.jcc.am.gd.a(gd.java:676)

环境 - Hibernate、JPA 2.0、DB2、Websphere 8.0、RAD、Java EE 6 部署网络。

  1. 在 Websphere JDBC/Sample 上创建了一个数据源。使用 DataSource 上的 DB 凭据创建了 J2C 身份验证。通过容器管理的身份验证将身份验证分配给数据源。

  2. Web.xml 条目

    resource-ref
    res-ref-name Sample
    res-type javax.sql.DataSource
    res-auth Container
    res-sharing-scope Shareable
    resource-ref
    
  3. ibm-web-bnd.xml 条目

    resource-ref name="jdbc/Sample" binding-name="java:comp/env/jdbc/Sample" 
    
  4. 持久性.xml

    persistence-unit name="samplePool" transaction-type="JTA"
    provider org.hibernate.ejb.HibernatePersistence
    jta-data-source jdbc/Sample
    properties
    property name="hibernate.transaction.manager_lookup_class"         value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup"
    property name="hibernate.dialect" value="org.hibernate.dialect.DB2390Dialect"
    properties
    persistence-unit
    persistence
    
  5. Dao 中的代码

     eMgrFactory = Persistence.createEntityManagerFactory("samplePool");
     entityMgr = eMgrFactory.createEntityManager();
     entityMgr.createNativeQuery();
    

请注意,通过管理控制台创建数据源后,我能够成功测试连接。另请注意,如果我指定组件托管身份验证我能够通过代码访问。建议我如何通过 Container Managed 身份验证进行访问。

4

2 回答 2

0

今天,我能够为我的问题找到解决方案。整个问题原来是配置问题。很好,我能够解决。以下是我所做的更改

  1. persistence.xml 文件 - 我不再从这里直接查找 DataSource。我像这样在 web.xml 中查找(java:comp/env/jdbc/ds)
xml 版本="1.0" 编码="UTF-8"
持久性 xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 版本="2.0" xsi:schemaLocation= “http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd”
    持久性单元名称="dataPool" 事务类型="JTA"
        提供者 org.hibernate.ejb.HibernatePersistence 提供者
        jta 数据源 java:comp/env/jdbc/ds jta 数据源

        共享缓存模式 所有共享缓存模式

        特性
        属性名称="hibernate.dialect" 值="org.hibernate.dialect.DB2390Dialect"
        属性名称="hibernate.default_schema" 值="A11"
        属性名称="hibernate.transaction.manager_lookup_class" 值="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup"  
        属性名称="hibernate.transaction.jta.platform" 值="org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform"
        属性名称="hibernate.temp.use_jdbc_metadata_defaults" 值="假"
        特性

    持久性单元
坚持

  1. 在 Web.xml 我查找 DataSource
 
    资源参考
        资源参考名称 jdbc/ds 资源参考名称
        查找名称 实际数据源 查找名称
        资源类型 javax.sql.DataSource 资源类型
        res-auth 容器 res-auth
        res-sharing-scope 可共享的 res-sharing-scope
    资源参考

我为其他人发布解决方案。

于 2012-09-03T08:27:39.903 回答
0

部署后,您必须将数据源映射到您的应用程序。

地图资源参考文档

于 2012-08-17T20:56:30.473 回答