3

特定の列を として指定するマッピング ファイルがありますnot-null="true"NULLOracle データベースではテーブルの列が に設定されているため、これは間違いです。しかし、Hibernate がこれを「無視」していたため、マッピング ファイルを作成してから 1 年以上経った今でも、そのことに気付きませんでした。それは可能ですか?

わかりやすくするために。データベースで:

CREATE TABLE db.my_table
(...)
my_column NUMBER(10,0) NULL, (...)

マッピング ファイル:

<column name="MY_COLUMN" precision="10" scale="0" not-null="true">

次に、Java コードで:

getHibernateTemplate().saveOrUpdate(myEntity);

getHibernateTemplate().flush();

このコードは私たちの環境で動作しています。いつもそうでした。しかし、一部のクライアントには問題がot-null property references a null or transient valueあり、コードをデバッグしたときに意味がありませんでした。私の知る限り、このコードは決して実行できないはずです。

もちろん、クライアントの問題を解決するのは簡単です。マッピング ファイルを修正して、エンティティが適切に表現されるようにするだけです。しかし、ここでの本当の問題は、なぜ Hibernate がそれについて文句を言わないのかということです。

ここで、Hibernate の経験が豊富な他のエンジニアに尋ねましたが、誰もこれを見たことがありません。

では、誰かヒントをいただけませんか?

編集:テスト環境とクライアントの両方がまったく同じコードを実行していることを強調したいだけで、どちらの場合も、myEntityオブジェクトのmyColumnプロパティが に設定されていNULLます。それで、私を困惑させているのは、なぜ私たちの環境で例外が発生しないのかということです.

4

2 に答える 2

1

私はまったく同じ問題を抱えていました:

休止状態のマッピング ファイルnot-null="true"で、特別な列を設定しました。

私の開発マシンでは、例外なしでnull 値を保持できました。お客様のマシンでは、常にPropertyValueException / DataIntegrityViolationException.

これは危険な行為でした。手動および自動テストは失敗しません。

解決:

私の開発マシンでは、プロパティhibernate.check_nullabilityをに設定するのが嫌いtrueです。その後、開発システムでも例外が発生しました。

結論

この奇妙な動作はhibernate validator、クラスパスに を追加したことが原因である可能性があります。これはcheck_nullabilityfalse になります。この関連する質問を参照してください: Spring Validation を有効にする方法

どういうわけか、これは私の開発システムにのみ適用され、本番環境には適用されません。これは、異なるアプリケーション サーバー内の異なる依存関係の読み込みが原因である可能性があります。

于 2015-09-29T16:43:41.303 に答える