--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
認識できない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 のクラスパスを使用して、方言内から方言プロバイダーを実装します 。JdbcDialectResolver
Connection
Dialect
org.springframework.data.jdbc.repository.config.DialectResolver$JdbcDialectProvider
META-INF/spring.factories
DialectResolver
SpringFactoriesLoader
DM、Firebird を使用するには、次の 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 では増加しません。