0

私は比較的複雑なエンティティを持っています。このようなもの:

@Entity
public class MyEntity {

/// some fields
///...

@OneToMany(/*cascade = CascadeType.ALL, */fetch = FetchType.EAGER)
@Fetch(FetchMode.SELECT)
@Cascade({CascadeType.ALL})
protected Set<ParameterValue> parameterValues 

//...
}

@Entity
public class ParameterValue {

// ...
 @ManyToOne(fetch = FetchType.EAGER)
 @Cascade({org.hibernate.annotations.CascadeType.MERGE,     org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.REFRESH})
 private Parameter  parameter

}

MyEntity には文字列 ID があり、ParameterValue には長い ID が生成され、Parameter には文字列 ID があります

私のエンティティにはパラメータ値があり、それぞれにパラメータがあり、異なるエンティティの他のパラメータ値間で共有されます

パラメータは異なる実装を持つ抽象クラスです

私の問題は、そのようなオブジェクトに対して hibernate セッション saveOrUpdate を呼び出すと、1) 非常に遅い 2) 時々 org.hibernate.NonUniqueObjectException を受け取ることです: 同じ識別子の値を持つ別のオブジェクトが既にセッションに関連付けられていました: [com.xxx. entities.content.EnumParameter#-1672482954]

そのようなエンティティを保存/更新する正しい方法は何ですか?

前の開発者からスキーマを継承したので、保存を簡素化する必要がある場合は変更できます

4

1 に答える 1

1

longデータベース内の適切な主キー (一意のインデックス付き) である一意の IDに移行すると、更新が大幅に高速化されます。

何を更新するかにもよりますが、eager fetch を取り除くことは、物事を高速化するもう 1 つの方法ParamValueですMyEntity。それだけを取得しParamValue、変更後に保存します ( select p from ParamValue p where p.entity=:entity)。

コードが実際に何をするかによって異なりますが、これら 2 つのこと (遅延読み込みと適切な一意のキー) によって速度が向上しますが、遅延読み込みではコードの見直しが必要になる場合があります。

于 2013-11-12T14:31:43.463 に答える