9

プロジェクトの Hibernate でカスタム UserType を作成しています。isMutable メソッドにたどり着くまでは、比較的簡単でした。私は、この方法が契約上何を意味するのかを理解しようとしています。

UserType を作成しているクラスが不変であることを意味するのでしょうか、それとも、このクラスのインスタンスへの参照を保持するオブジェクトが別のインスタンスを決して指さないことを意味するのでしょうか?

オブジェクト自体が変更可能だったため、 Hibernate Community Wikiで true を返した例をいくつか見つけました- http://www.hibernate.org/73.html

コミュニティ wiki の他の例は、変更可能であるにも関わらず、理由を説明せずに false を返しました。

JavaDoc を確認しましたが、あまり明確ではありません。

UserTypeの JavaDoc から:

public boolean isMutable()
    Are objects of this type mutable?
    Returns:
        boolean

Typeの JavaDoc から:

public boolean isMutable()
    Are objects of this type mutable. (With respect to the referencing
    object ... entities and collections are considered immutable because
    they manage their own internal state.)
    Returns:
        boolean
4

2 に答える 2

11

Hibernate は、「変更可能」とマークされた型を、新しい参照を指すことなく変更できる (つまり、UPDATE が必要) かのように扱います。Hibernate がロードしたプロパティに新しい参照を割り当てると、型が不変であっても Hibernate はこれを認識します。これは、たとえば String フィールドで常に発生します。しかし、たとえば、StringBuilder フィールドがあり、それを不変としてマークした場合、 Hibernate はStringBuilder を変更しても認識しません。

詳細とサンプル プロジェクトについては、このブログ投稿を参照してください。

于 2009-11-23T13:13:28.930 に答える
2

ここでの典型的な例はStringクラスです-これは不変です。つまり、文字列が作成されると、その内容や状態を変更することはできません。必要に応じて、新しいコピーに処理する必要があります。

isMutableがtrueを返すとは、このオブジェクトの状態が外部オブジェクトによって変更される可能性があることを意味し、falseを返すと、このオブジェクトを新しいインスタンスにコピーして、途中で状態を変更する必要があることを意味します。または、あなたが言ったように、「このクラスのインスタンスへの参照を保持するオブジェクトが別のインスタンスを指すことは決してないということですか」。

于 2008-10-22T08:31:37.010 に答える