0

既存の AS400 データ ストアと通信しようとしている Tomcat ベースの webapp を開発しています。動作する既存の Web アプリからほとんどの設定をコピーしましたが、新しいアプリを実行すると、次のようになります。

2013-08-08 13:50:11,988 ERROR [RMI TCP Connection(3)-127.0.0.1] org.hibernate.tool.hbm2ddl.SchemaValidator - could not get database metadata
java.sql.SQLException: [SQL5016] Qualified object name SYSSEQUENCES not valid.
    at com.ibm.as400.access.JDError.throwSQLException(JDError.java:646)
    at com.ibm.as400.access.JDError.throwSQLException(JDError.java:617)
    at com.ibm.as400.access.AS400JDBCStatement.commonPrepare(AS400JDBCStatement.java:1578)
    at com.ibm.as400.access.AS400JDBCStatement.executeQuery(AS400JDBCStatement.java:2138)
    at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)
    at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)
    at org.hibernate.tool.hbm2ddl.DatabaseMetadata.initSequences(DatabaseMetadata.java:151)
    at org.hibernate.tool.hbm2ddl.DatabaseMetadata.<init>(DatabaseMetadata.java:69)
    at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:132)
    at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:378)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906)
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:74)
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:288)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310)
[SNIP]

SYSSEQUENCES オブジェクト (おそらくテーブル) の検索に失敗しているように見えますが、私のスキーマまたは私が認識しているどこにもそのようなテーブルはありません。なぜこれを行うのですか?どうすれば修正できますか?

接続に使用している SERVER.XML リソースは次のとおりです。

    <Resource 
        name="jdbc/myresource" 
        auth="Container" 
        driverClassName="com.ibm.as400.access.AS400JDBCDriver" 
        maxActive="20" 
        maxIdle="10" 
        maxWait="5000" 
        password="mypassword" 
        testOnBorrow="true" 
        type="javax.sql.DataSource" 
        url="jdbc:as400://mysystem.mycompany.com;libraries=LIB1 LIB2 LIB3;dateformat=iso;timeformat=iso;prompt=false;naming=system;transaction isolation=none" 
        username="myusername" 
        validationQuery="SELECT * from sysibm/sysdummy1"/>

ここに私の PERSISTENCE.XML があります:

<persistence-unit name="myPersistenceUnit">
    <properties>
        <property name="hibernate.generate_statistics" value="true" />
        <property name="hibernate.cache.use_structured_entries" value="true" />
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.jdbc.batch_size" value="100" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.DB2400Dialect" />
        <property name="hibernate.hbm2ddl.auto" value="validate"  />
    </properties>
</persistence-unit>
4

2 に答える 2

2

スタック トレースを調べると、問題は から始まりますorg.hibernate.tool.hbm2ddl.DatabaseMetadata.initSequences

このinitSequencesメソッドは、方言がシーケンスをサポートしているかどうかをチェックします。

DatabaseMetadata.initSequences

private void initSequences(Connection connection, Dialect dialect) throws SQLException {
    if ( dialect.supportsSequences() ) {
        String sql = dialect.getQuerySequencesString();

DB2400Dialect は、次のことを報告していません。

DB2400Dialect.java

public class DB2400Dialect extends DB2Dialect {
    @Override
    public boolean supportsSequences() {
        return false;
    }

参考までに、基本 DB2Dialect はシーケンスと参照をサポートしていますsysibm.syssequences

DB2方言.java  

@Override
public boolean supportsSequences() {
    return true;
}

@Override
public String getQuerySequencesString() {
    return "select seqname from sysibm.syssequences";
}

ダイアレクトが適切に設定されていないか、DB2400Dialect のバージョンがシーケンスをサポートしていると報告しているようです。

于 2013-08-08T22:30:55.883 に答える
0

以下を使用してみてください。

public class DB2AS400Dialect extends DB2400Dialect {
    @Override
    public String getQuerySequencesString() {
        return null;
    }
}

Dialect クラスは次のことを行うため:

public SequenceInformationExtractor getSequenceInformationExtractor() {
    if ( getQuerySequencesString() == null ) {
        return SequenceInformationExtractorNoOpImpl.INSTANCE;
    }
    else {
        return SequenceInformationExtractorLegacyImpl.INSTANCE;
    }
}

方言がシーケンスをサポートしている場合、ブール値を参照する代わりに。

于 2016-02-17T19:02:39.260 に答える