私はここで途方に暮れています.Hibernateの専門知識が他の分野よりも弱いため、おそらくそれは明らかなことです.
レガシー コードには Hibernate@Entity
クラスがありFoo
ます。そのプロパティの 1 つを次に示します。
private OldBar bar = new OldBar();
OldBar
は@Embeddable
、単一の列を使用するクラスですfoobar
:
@Embeddable
public class OldBar {
private String fooBar;
@Column(length = 10, nullable = false)
private String getFooBar() {
return fooBar;
}
@SuppressWarnings("unused")
private void setFooBar(String fooBar) {
this.fooBar = fooBar;
}
}
元の問題は、 で何かをする必要があったことですOldBar.fooBar
が、元の設計には制限があり、このフィールドを非公開にしていたため、サブクラス化できませんでした。そのため、別のクラス全体を作成して、他のクラスNewBar
を置き換えてアクセスできるようにする必要がありました。プライベート フィールド。NewBar
もEmbeddable
同じ指定を持っているので@Column
、クラスのフィールドを交換するだけでよいと思いましたFoo
:
private NewBar bar = new NewBar();
列に既存のデータがあり、foobar
このデータを透過的に使用したかったので、これを行いたかったNewBar
のOldBar
です。
コンストラクターが呼び出されたときに、予想どおり、Foo()
デフォルト バージョンの が作成されることをトレース ログで確認しました。NewBar()
しかし、コードが を呼び出すFoo.getBar()
までに、何らかの理由bar
でnull
! null
Hibernate が何らかの理由で に設定していると思いますが、Hibernate がfoobar
列からデータを読み取って のインスタンスを作成しないのはなぜNewBar
ですか? OldBar
の代わりに戻すと、再び機能するようになるのはなぜNewBar
ですか? 確かに、データベース自体には、どの@Embeddable
クラスが列にマップされているかを示すものは何もありませんよね?
更新:これはますます奇妙になります。コードを一晩放置して、翌日には機能することもあります。または次の日はうまくいきません!ちょうど今うまくいかなかった (つまり、データベースの値の代わりにfoobar
プロパティが設定されていた) ので、クラスを作成して .の代わりに配置しました。うまくいきました!そこで、一時的な変更を元に戻すだけに戻ります。以前は機能していなかったのに、まだ機能していました。Hibernate が値をシリアル化し、データベースから取得しないようなキャッシュはありますか? これは非常に奇妙です。null
ExactCopyOfOldBar
OldBar
NewBar
更新:今、私はまったく仕事に就くことができなくなりNewBar
ました。を作成します。これは、名前が異なることOtherBar
を除いて基本的には と同じです。プラグインすると、埋め込まれた文字列を正しく読み取って動作します。NewBar
に切り替えるNewBar
と、再び取得null
します。何が起こっている?
Foo
がロードされていることに注意してくださいnet.databinder.auth.hib.AuthDataApplication.getUser(String username)
。これは非常に単純です。
return (DataUser) Databinder.getHibernateSession().createCriteria(getUserClass())
.add(Restrictions.eq("username", username)).uniqueResult();
Foo
(ユーザー)テーブルに正しいデータを含む単一の行があること、そして最も重要なことに、foobar
フィールドにデータがあることを何度も確認しました。Foo
なぜ Hibernate は私にnull
foobar
フィールドを返すのですか? NewBar
から切り替えるだけで、OtherBar
再び機能し始めるのはなぜですか? 一日中動作し、一晩放置すると動作しなくなるのはなぜですか?