0

私のアプリケーションは、ドメイン レベルの値オブジェクト間で多くの OneToMany および OneToOne 参照を使用します。それらのほとんどはエンティティであり、何かのスーパー クラスまたはサブクラスです。それらのインスタンスと実際のメソッド save() はそのままです

@Transactional
public void save(Post post){

   try{
      JPA.em().persist(post);
   }catch (EntityExistsException eee){
      JPA.em().merge(post);
   }catch(ConstraintViolationException cve){
      JPA.em().refresh(post);
   }
} 

現在の問題は、これらのオブジェクトを適切にインスタンス化する方法と、cascadeType でどの戦略を選択するかです。他のエンティティとの参照を含むオブジェクトを保存するときに、ネストされたオブジェクトを保存したいと考えています。Unique index or primary key violation明らかinsert into Utente (passwd, DTYPE, username) values (?, 'Redattore', ?) [23505-168]に、私のJPAプロバイダー(hibernate 3.6.9)は既存の行の更新に失敗し、代わりにDBに新しいエントリを挿入しようとします。私が使用しているいくつかのクラスは次のとおりです。

@Entity
@Table
public class Post extends Domanda {

@Column(nullable = false)
private String nome;

@OneToMany(cascade = CascadeType.ALL)
private List<Commento> commenti;

@OneToMany(cascade = CascadeType.ALL)
private List<Risorsa> risorse;

@OneToOne(cascade = CascadeType.ALL)
private NodoApprendimento nodo;

@Column
private int visibilità;

@Column
private boolean isDraft;

Post はいくつかのクラスによって参照されます。その中には次のようなものがあります。

@Entity
public abstract class Partecipante extends Utente{


@OneToMany(cascade = CascadeType.ALL,
           fetch = FetchType.LAZY)
private Set<Post> contributi;

次に、データベース内の参照オブジェクトを初期化および永続化または更新する適切な方法を知りたいと思います。事前に感謝します。

4

1 に答える 1

0

これはプロバイダーの問題ではなく、使用上の問題です。persist を呼び出す場合、JPA はプロバイダーがすぐに挿入を実行する必要はありません。通常、プロバイダーはフラッシュまたはコミット時間に遅れます。したがって、ほとんどの場合、EntityExistsException は発生しません。いずれにせよ、トランザクションの状態はロールバック用にマークする必要があります。マージを呼び出す必要があるかどうかを判断するために永続化に頼るべきではありません。em.find を呼び出すか、エンティティで em.merge を呼び出して、JPA プロバイダーが挿入または更新を行う必要があるかどうかを判断できるようにします。

于 2013-07-03T17:21:06.367 に答える