Hibernateは、そのアソシエーションのオブジェクトがコンポジットキーである場合、FKリファレンスを更新していないようです。ターゲットがコンポジットキーの場合、HibernateはManyToOneを保存しません
トランザクションは成功しますが(エラーもスタックトレースもありませんが)、更新ステートメントは生成されません(私は休止状態のロギングを有効にしています)。
私は、カスケード注釈(カスケード、ALL、PERSIST、さらにSAVE_UPDATEはありません)のすべてのやり方を試してみました。この更新のない症状は、OpenXavaのオンライン画面とカスタムJavaコードの両方から(OpenXavaアクション内に)存在します。
アプリケーションデータベースには、テーブルへの外部アップロードを許可する必要があるため、システムに割り当てられたキーに切り替えることは、彼らが追求するオプションではないと言われています。
(現在は任意のカスケード設定なし)所有協会:
@ManyToOne(fetch=FetchType.LAZY,optional=false)
@Required
@JoinColumns({
@JoinColumn(name="programID",referencedColumnName="programID",nullable=false,unique=false,insertable=false,updatable=false),
@JoinColumn(name="projectID",referencedColumnName="projectID",nullable=false,unique=false,insertable=false,updatable=false)
})
@DescriptionsList(descriptionProperties="parentProgram.programName,projectName")
@ReferenceView("reference")
private Project associatedProject;
逆相関:
@OneToMany(mappedBy="associatedProject",fetch=FetchType.LAZY) //No cascade allowed
@ReadOnly
private Set<Asset> assets = new HashSet<Asset>();
オープンHibernateのバグがこの上がある場合
誰もが知っていますか?私はGoogleの検索を使用して見つけることができませんでしたが、おそらく誰かが最初の経験を持っています。
ありがとう、 Roy。
EDIT:回避策として、独自のHQLアップデートを作成しようとしました。 SET句を処理している間に鈍角Hibernateの構文エラーunexpected AST node: AND
に失敗し
update Asset set associatedProject = :ap where assetKey = :key
。
update Asset cross join set projectID=?, programID=? where assetKey=?
を生成して、自分のSQLの更新作業を行って、しかし「クロス」
で無効な構文で失敗しました
update Asset set associatedProject.projectId = :projId, associatedProject.parentProgram = :pgm where assetKey = :key
。
誰かがより良い回避策を持っていますか?根本問題のさらなる考え方は?私の意見で
が、これはまだHibernateのバグを指す(もちろん、それはバグだ - あなただけ エラーやメッセージなし更新をスキップすることはできません)複合キーの取り扱いと。
私はあなたのしたことをよく見ていませんが、休止状態のバグではないと考えています(休止状態は成熟しています)。 –
@Robertは私の経験ではなく、そんなにありません。コンポジットキーのサポートのほとんどは、良く知られていませんし、広告されたものと正確には動作しません(ただし、ほとんどの問題の回避策があります)。 –
@Brian 'programID/projectID'は、プロジェクトエンティティの複合キーです。 'programID'はプログラムエンティティのための単一のキーです。プログラムには多くのプロジェクトがあります。アセット(私の引用符で囲まれたコードのコンテキスト)は、特定のプロジェクト(Assetテーブルの2列FKとして実装されています)に関連付けられていますが、あるプロジェクトから別のプロジェクトに転送できます。これが症状の原因です - あるプロジェクトから別のプロジェクトへの関連付けを変更するとき、Hibernateは変更された 'associatedProject'値を保持しません。 –