既存の値を使用した多対多マッピングの休止

hibernate java many-to-many
既存の値を使用した多対多マッピングの休止

JPA2とHibernateの使用

ソースデータで相互に関連する2つのクラスがあります。

人物クラス:

@Entity
public class Person {
@Id @Column("PERSON_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String name;
private String job;
// getters & setters
}

そして、Movieクラス:

@Entity
public class Movie {
@Id @Column("MOVIE_ID")
private long id;
private String movieName;
private String rating;
@ManyToMany
@JoinTable(name = "Movie_Actor",
joinColumns = @JoinColumn(name="Movie_ID"),
inverseJoinColumns = @JoinColumn(name="Person_ID")
)
private Set actors = new HashSet();
// getters & setters
}

アクターは、job = “Actor”を持つインスタンス化された `Person`です。 作家、監督などを追加する予定です。 これが機能したら、後でミックスに。 最初に、ActorオブジェクトはIDを持っている場合と持っていない場合があります(後でデータベースから読み取り、「PERSON_ID」が読み込まれると仮定します)。

アクターは `Movie`クラスに追加されます:

Person actor = new Person();
actor.setId=0;
actor.setName="Actor Name";
actor.setJob="Actor";
movie.addActor(actor);

From Movie.java
public void addActor(Person actor) {
actors.add(actor);
}

現在、Person(actors)およびMovieオブジェクトをデータベースに挿入するコードが動作しています(現在存在しない限り)。

私がやりたいのは、他の場所からのデータで充実させた後、 Person`オブジェクトを更新することです(例: 引用符/写真)、それをデータベース `session.save(actor)`に永続化し( `PERSON_ID`を作成し、 Movie`オブジェクトを保存します)。

問題は、更新された Person(IDを含む)で` Movie`オブジェクトを更新すると、データベースで一意の制約エラーが発生することです( `Person`が既に存在するため)。

これらの事前に作成された「Person」オブジェクトに関係がある場合とない場合で、「Movie」オブジェクトを保存するにはどうすればよいですか?

” ” ‘

編集:トーマスの提案に従って、私はsession.saveをsession.saveOrUpdateに変更しました。これにより、固有の絶え間ない問​​題が解決されます。

  1  1


ベストアンサー

私があなたがしていると思うことと、 `saveOrUpdate`がその問題を修正する理由を要約するだけです:

`save`はそのエンティティの新しいインスタンスをデータベースに作成し、既に存在するIDを許可されたものとして取得する場合があります。 このメソッドはエンティティの作成専用であり、更新用ではありません。

一方、 `saveOrUpdate`は最初に、渡したエンティティが既に存在するかどうかを確認し、存在する場合は更新を行います。 存在しない場合は、新しいデータセットが作成されます。

したがって、 `save`を使用して更新すると、同じIDを持つ2つのデータセットが作成されるため、一意のキー制約違反が発生します。

2


タイトルとURLをコピーしました