2017-07-13 20 views
0

私の質問は休止状態に関するものです。つまり、データベースに保存するためにキューに入れている2つのオブジェクトがあります。これらのオブジェクトは、すべてのフィールドの値がまったく同じです。私の休止状態は、50回のクエリの後で自動フラッシュするように設定されているので、休止状態に移行すると直ちにこれらのオブジェクトをデータベースにフラッシュしないと仮定しよう。休止状態は、これらのオブジェクトのそれぞれを別個のエンティティとしてデータベースに保存する(重複するレコードを「別個のレコード」として保存する)か、またはこれらのオブジェクトが全く同じ値を持つことを認識し、これらのミラーオブジェクトのインスタンスをデータベース?休止状態のニュアンスセッション

+0

彼らにはIdフィールドがありますが、その値は何ですか? –

+0

idフィールドはシーケンスで生成され、hibernateによって処理されます。フィールド値は、clobと文字列です。 – Daniel

+0

保存時の値は何ですか? –

答えて

0

データベースに1つまたは2つのエンティティがあるかどうかは、equals()(およびhashcode)の実装によって異なります。オブジェクトが等しいと見なされると、エンティティは1つになりますが、そうでない場合は2つになります。

自動生成されたサロゲートキーを使用する場合は、特に注意する必要があります。オブジェクトを初めて保存する前に、キーが割り当てられていません。したがって、equals()の実装はキーの等価性に依存できません。この特別な条件を処理することを確認する必要があります 。

+0

さて、これらのオブジェクトに対してequalsまたはhashcodeが実装されていないので、おそらく私の想定は正しいと思います。つまり、休止状態ではオブジェクトが複製として表示され、1つのコピーのみがデータベースに保存されます。 – Daniel

+1

これは正しいとは思いませんが、デフォルトの動作はオブジェクトが同じオブジェクトを参照しているかどうかをチェックすることでしょうか?これはそうではなく、これらは別個のメモリ位置を占有する別個のオブジェクトである。 – Daniel

+0

はい、equals()のデフォルトの実装では、それらが同一(x = y)の場合にのみtrueを返します。エンティティの2つのインスタンスを作成した場合は、DBに2つのエンティティ(=行)が表示されます。ただし、オブジェクトが同一である場合は、それらをセッションに2回追加すると、エンティティは1つだけになります。 – fhossfel

0

私の質問は、休止状態に関するものです。つまり、 という2つのオブジェクトがデータベースに保存されているとします。

言い換えれば、データベースに保存したいエンティティが2つあります。

これらのオブジェクトは、フィールドごとにまったく同じ値を持っています。 Javaでは

equals(及びhashcode)によって実装オブジェクト・アイデンティティがあります。データベースには行IDがあります - 一意の行を識別する主キー(変換は一意のインスタンスです)。エンティティのインスタンスをテーブルの行にマッピングするので、同じクラス(同じエンティティ)の2つのインスタンスを区別する方法は、各インスタンスに一意のプライマリキーを提供することです。 JPA(HibernateはJPAの実装です)では、フィールド(Entityの属性)に@Idという注釈を付ける必要があります。一意に識別することができます。

以下のクラスは、一意のIDを持つEntityクラスです。

@Entity 
public MyClass 

@Id 
@GeneratedValue 
private Long id; 

あなたはどちらかのユニークなIDにあなたが持続またはあなたが@GeneratedValueで自動生成を使用することができ、それぞれの時間を提供することができます。基礎となるデータベースに応じて異なる世代戦略があります。

+0

はい、私はこれをすべて理解し、これを行っています。それらには、JPAアノテーションでアノテーションされたIdオブジェクトフィールドがあります。私はシーケンスデータベース側で作成されているので、IDの作成を処理するために休止状態をさせています。しかし、私は記録を失っている、彼らは存在しなくなる – Daniel

+0

あなたはどのようにして、どのようにトランザクションが制御されているか、より多くの情報を提供してください。私はこの情報を提供して、JavaのIDがJPAに関係しないことを示しました。 – fg78nc

+0

AOPスプリングトランザクション管理では、オブジェクトを保存するメソッドに、@Transactionalタグが直列化可能な分離レベルで注釈が付けられます。私はSpring Data JPAを使用していますので、オブジェクトが持続するときを管理していなくても、JPAリポジトリを使用してオブジェクトを保存します。 – Daniel