@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

NHibernateのCriteria.list()でSQLのUpdateが実行される

1
投稿者投稿内容
みあた
会議室デビュー日: 2007/12/07
投稿数: 2
投稿日時: 2007-12-07 14:32
NHibernateを試しています。

関連付けさせたObjectをCriteria.list()で取得しようとすると、
関連先のObjectをUpdateしようとして日付のエラーが発生します。

UPDATEさせない設定を探してみたのですが解りませんでした。
UPDATEの回避ができないなら日付のエラーを回避したいです。

開発言語はC#.NET
NHibernateのバージョンは1.2.1.4000
データベースはMSDE2000 Release A
MyGenerationでクラス・XMLは自動生成しています。

日付のあるクラスのコンストラクタでDateTime.Nowしています。
データーベースのレコードには異常な日付はありませんでした。

ログ
2007-12-07 11:37:39,759 [10] 【WARN 】NHibernate.Util.ADOExceptionReporter 0行目 System.Data.SqlTypes.SqlTypeException: SqlDateTime のオーバーフローです。1/1/1753 12:00:00 AM から 12/31/9999 11:59:59 PM までの間でなければなりません。
....
2007-12-07 11:37:39,775 [10] 【ERROR】NHibernate.Impl.SessionImpl 0行目 could not synchronize database state with session
NHibernate.ADOException: could not update: [child#2][SQL: UPDATE child SET ....

関連元テーブルのXML
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="parent,test" table="parent" lazy="false">
<id name="parentId" column="parentId" type="Int32" unsaved-value="0">
<generator class="native"/>
</id>
<many-to-one name="childId" column="childId" not-null="false" class="Child,test" />
</class>
</hibernate-mapping>

関連先テーブルのXML
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="child,test" table="child" lazy="false">
<id name="chiliId" column="chiliId" type="Int32" unsaved-value="0">
<generator class="native"/>
</id>
<property column="childDate" type="DateTime" name="childDate" />
</class>
</hibernate-mapping>

よろしくお願いします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-12-07 21:53
NHibernateは全くさわったことがないですが、
Criteria.list()を呼ぶ前にFlush()してみるとどうなりますか?
おそらく対象テーブルのDirtyなエンティティを永続化しているんでしょう。

Hibernateはこの手の更新の反映を極力遅らせて効率化しようとします。

セッションに関連付いたエンティティをいじった(更新した)場合は
一連の処理を終える時にFlush()しないとエラーの原因の特定が難しくなります。
みあた
会議室デビュー日: 2007/12/07
投稿数: 2
投稿日時: 2007-12-11 18:41
返答ありがとうございます。

結果の連絡が遅くなりなりましてすみません。
Flush()では改善されませんでした。

結果ですが状況改善できました。
DataObjectのDatetimeにセットするメソッドのところで、
Exceptionに出ていた有効日付範囲外の日付をセットしないようにしたところ、
正常に動作するようになりました。

【ADOException】内で【could not update】だったので、
データベースに対してUpdateを変えているのかと考えてしまったのが間違いでした。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)