Springboot2.x+springjdbc+Dameng データベース

--Spring Data JDBC DM 方言を認識できません

目次

--Spring Data JDBC DM 方言を認識できません

同様の問題

1 Spring Data REST @Idclass が認識されません

2 Spring JDBC および Firebird データベース

3 Spring Data JDBC/Spring Data JPA と Hibernate

2 つの問題の説明

エラーは以下の3つです

1 エラーのスクリーンショット

2 エラーメッセージ

4つのプロジェクト構成は以下の通りです

1 Maven 依存関係が追加されました

5つの解決策

他に6つの質問

1 ワードフィールドの長さは固定です

参考文献

認識できないSpring Data JDBC Firebird方言 - コードログ

spring.factories の魔法の効果 - プログラマーが求めた

https://blog.csdn.net/mamalululu00000000/article/details/86711079


同様の問題

1 Spring Data REST @Idclass が認識されません

2 Spring JDBC および Firebird データベース

3 Spring Data JDBC/Spring Data JPA と Hibernate

2 つの問題の説明

Spring Data JDBC と Spring Boot を使用して DM データベースに接続しようとしています。Spring Tools を使用して単純なアプリケーションを作成しました。Spring Data JDBC は方言を認識しません。問題は DM がサポートされていないことだと思いますDialectResolver

@Nullable
private static Dialect getDialect(Connection connection) throws SQLException {     DatabaseMetaData metaData = connection.getMetaData()
;
   
文字列名 = metaData.getDatabaseProductName().toLowerCase(Locale.ENGLISH) ;
    if
(name.contains( "hsql" )) {
       
return HsqlDbDialect.INSTANCE ;
   
} else if (name.contains( "h2" )) {
       
return H2Dialect.INSTANCE ;
   
} else if (!name.contains( "mysql" ) && !name.contains( "mariadb" )) {
       
if(name.contains( "postgresql" )) {
           
return PostgresDialect.INSTANCE ;
       
} else if (name.contains( "microsoft" )) {
           
return SqlServerDialect.INSTANCE ;
       
else if (name.contains( "db2" )) {
           
return Db2Dialect.INSTANCE ;
       
} else {             DialectResolver.LOG.info(String.format(
"\" %s \" " , name)の方言を特定できませんでした) ;             null を返します。その他     _ _

       

{
       
return new MySqlDialect(getIdentifierProcessing(metaData)) ;
   
}
}

エラーは以下の3つです

1 エラーのスクリーンショット

 

2 エラーメッセージ

[email protected]/java.lang.Thread.run(Thread.java:834)

2021-12-22 19:56:38.216 [TID: N/A] [メイン] 情報 logger_name:osbalConditionEvaluationReportLoggingListener -

ApplicationContext の起動中にエラーが発生しました。条件レポートを表示するには、「デバッグ」を有効にしてアプリケーションを再実行します。

2021-12-22 19:56:38.390 [TID: N/A] [main] エラー logger_name:osboot.SpringApplication - アプリケーションの実行に失敗しました

org.springframework.beans.factory.UnsatisfiedDependencyException: クラスパス リソース [org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class] で定義された名前 'jdbcConverter' を持つ Bean の作成エラー: メソッド 'jdbcConverter を通じて表現された依存関係が満たされていません' パラメータ 4;

ネストされた例外は org.springframework.beans.factory.BeanCreationException です: クラスパス リソース [org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class] で定義された名前「jdbcDialect」を持つ Bean の作成エラー: ファクトリによる Bean のインスタンス化メソッドが失敗しました。ネストされた例外は

 org.springframework.beans.BeanInstantiationException: インスタンス化に失敗しました [org.springframework.data.relational.core.dialect.Dialect]: ファクトリ メソッド 'jdbcDialect' が例外をスローしました。ネストされた例外は org.springframework.data.jdbc.repository.config.DialectResolver$NoDialectException です: の方言を決定できません

org.springframework.jdbc.core.JdbcTemplate@499a93a9。方言を入力してください。

原因: org.springframework.beans.factory.BeanCreationException: クラスパス リソース [org/springframework/boot/autoconfigure/data/jdbc/JdbcRepositoriesAutoConfiguration$SpringBootJdbcConfiguration.class] で定義された名前「jdbcDialect」を持つ Bean の作成エラー: ファクトリによる Bean のインスタンス化メソッドが失敗しました。

ネストされた例外は org.springframework.beans.BeanInstantiationException です: インスタンス化に失敗しました [org.springframework.data.relational.core.dialect.Dialect]: ファクトリ メソッド 'jdbcDialect' が例外をスローしました。ネストされた例外は org.springframework.data.jdbc.repository.config.DialectResolver$NoDialectException です: 方言を特定できません

 org.springframework.jdbc.core.JdbcTemplate@499a93a9 の場合。方言を入力してください。

原因: org.springframework.beans.BeanInstantiationException: インスタンス化に失敗しました [org.springframework.data.relational.core.dialect.Dialect]: ファクトリ メソッド 'jdbcDialect' が例外をスローしました。ネストされた例外は org.springframework.data.jdbc.repository.config.DialectResolver$NoDialectException です: の方言を決定できません

org.springframework.jdbc.core.JdbcTemplate@499a93a9。方言を入力してください。

         org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) で

         org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:652) で

         ... 34 個の共通フレームを省略

原因: org.springframework.data.jdbc.repository.config.DialectResolver$NoDialectException: org.springframework.jdbc.core.JdbcTemplate@499a93a9 の方言を特定できません。方言を入力してください。

4つのプロジェクト構成は以下の通りです

1 Maven 依存関係が追加されました

<依存関係>
   <groupId> com.dameng </groupId>
   <artifactId> Dm8JdbcDriver18 </artifactId>
   <version> 8.1.1.49 </version>
</dependency>
<dependency>
   <groupId> com.dameng </groupId>
   <artifactId > DmDialect-for-hibernate5.0 </artifactId>
   <バージョン> 8.1.1.49 </version>
</dependency>

5つの解決策

Spring Data JDBC ライブラリ自体には既製の DM (Firebird ダイアレクト) が含まれていないため、自分で提供する必要があります。Spring  JDBC ドキュメントの基礎となる構成に注釈を付けます

方言はパス検査 (通常は Inspection )JdbcOperationsによって解決されます。次の を実装するクラスを登録することで、 Spring に パスの作成を自動検出させることができます。 検出は Spring のクラスパスを使用して、方言内から方言プロバイダーを実装します JdbcDialectResolverConnectionDialect org.springframework.data.jdbc.repository.config.DialectResolver$JdbcDialectProviderMETA-INF/spring.factoriesDialectResolverSpringFactoriesLoader

DM、Firebird を使用するには、次の 3 つを定義する必要があります。

  1. 方言
  2. 方言パーサー
  3. 方言リゾルバーを見つけるための Spring の構成ファイル

方言は次のようなものになります(この方言はDM Firebird 3以降を前提としていることに注意してください):

パッケージspring.dm ;

org.springframework.data.relational.core.dialect.AnsiDialectをインポートします
org.springframework.data.relational.core.dialect.ArrayColumnsをインポートします
org.springframework.data.relational.core.dialect.LockClauseをインポートします
org.springframework.data.relational.core.sql.LockOptionsをインポートします

public class
DMDialect extends AnsiDialect {
   
public static Final DMDialect INSTANCE = new DMDialect() ;
   
@Override
   
public LockClause lock () {
       
returnLOCK_CLAUSE ;
   
}

   
@Override
   
public ArrayColumns getArraySupport () {
       
ArrayColumns.Unsupportedを返します。インスタンス; } private static Final LockClause LOCK_CLAUSE = new LockClause() { @Override public String getLock (LockOptions lockOptions) { return "WITH LOCK" ; } @Override public Position getClausePosition () { 位置を返しますAFTER_ORDER_BY ; }     }
   


   


       

       

           

        


       

       

           

       

;
}

方言リゾルバー。Firebirdデータベースに接続されている場合は方言を返します

パッケージspring.dm ;

org.springframework.data.jdbc.repository.config.DialectResolverをインポートします
org.springframework.data.relational.core.dialect.Dialectをインポートします
org.springframework.jdbc.core.ConnectionCallbackをインポートします
org.springframework.jdbc.core.JdbcOperationsをインポートします

java.sql.Connectionをインポートします
java.sql.DatabaseMetaDataをインポートします
java.sql.SQLExceptionをインポートします
java.util.Localeをインポートします
java.util.Optionalをインポートします

パブリック クラス
DMDialectResolver実装DialectResolver.JdbcDialectProvider {

   
@Override
   
public Optional<Dialect> getDialect (JdbcOperations jdbcOperations) {
       
returnオプション。ofNullable (
                jdbcOperations.execute((ConnectionCallback<Dialect>)DMDialectResolver:: getDialect )
        )
;
   
}
   
private static Dialect getDialect (接続接続) throws SQLException {         DatabaseMetaData メタデータ = connection.getMetaData()
;
       
文字列名 = metaData.getDatabaseProductName().toLowerCase( Locale.ROOT );
        if
(name.contains( "dm dbms" )) { DMDialect
           
を返しますインスタンス;
       
null を返し
       
ます。
   
}
}

最後に、 META-INFspring.factoriesという名前のリソースを定義する必要があります。このファイルには次の行が含まれている必要があります。

org.springframework.data.jdbc.repository.config.DialectResolver$JdbcDialectProvider=spring.firebird.FirebirdDialectResolver

これにより、Spring Data JDBC が方言リゾルバーを検出して使用できるようになります。

他に6つ の質問

1.ダメンワードのフィールド長は固定です

Dameng データベースのフィールド長は自動的に増加しません。たとえば、文字列長が 50 の場合、保存された文字列が 50 を超えるとエラーが報告されますが、mysql では増加しません。

参考文献

認識できないSpring Data JDBC Firebird方言 - コードログ

spring.factories の魔法の効果 - プログラマーが求めた

https://blog.csdn.net/mamalululu00000000/article/details/86711079

おすすめ

転載: blog.csdn.net/u013380694/article/details/122105029