10

私はいくつかの映画を管理するためにHibernate/Springアプリケーションに取り組んでいます。

クラス映画は、クラスのジャンルと多対多の関係があります。これらのクラスは両方とも、GeneratedValueアノテーションを使用してIDを生成しています。

ジャンルは、@ Cascade(CascadeType.SAVE_UPDATE)を使用して、ムービーオブジェクトを介して保存されます。ジャンルのタイプ属性(名前、たとえば「ファンタジー」)に一意の制約を設定しました。

私が今やりたいのは、「ファンタジー」タイプのジャンルがすでに存在するかどうかをHibernateにチェックさせ、存在する場合は、新しいレコードを挿入する代わりに、そのジャンルのIDを使用することです。(後者は明らかにエラーをスローします)

最後に必要なのは、select-before-updateのようなものですが、select-before-saveのようなものです。

Hibernateにそのような機能はありますか?

いくつかのコード:

映画教室

@Entity
public class Movie {

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;

private String name;

@Lob
private String description;

@Temporal(TemporalType.TIME)
private Date releaseDate;

@ManyToMany
@Cascade(CascadeType.SAVE_UPDATE)
private Set<Genre> genres = new HashSet<Genre>();

.... //other methods

ジャンルクラス

@Entity
public class Genre {

@Column(unique=true)
private String type;

@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id

....//other methods
4

2 に答える 2

7

あなたはこれを考えすぎているかもしれません。select-before-update / select-before-saveオプションを使用すると、2つのDBラウンドトリップが発生します。1つ目は選択用で、2つ目は必要に応じて挿入用です。

最初から多くのジャンルがないことがわかっている場合は、ほとんどの場合、1RTでこれを行うためのいくつかのオプションがあります。

  1. Hibernateの第2レベルのキャッシュは、すべてではないにしても多くのジャンルを保持できるため、存在を確認するときに単純なハッシュテーブルルックアップ(単一ノードを想定)になります。
  2. すべてのジャンルがすでに存在していると想定し、session.load()を使用して、まだ存在していないジャンルを参照したときにスローされる行が見つからない例外の結果として新しい挿入を処理できます。

ただし、現実的には、多くのトランザクションについて話しているのでない限り、保存/更新前の単純な事前クエリによってパフォーマンスが低下することはありません。

于 2013-01-14T15:34:22.700 に答える
3

Hibernateのselect-before-update/select-before-saveでこのような関数について聞いたことがありません。このような状況では、HibernateをJDBCであるかのように扱う必要があります。

まず、そのようなジャンルがあるかどうかを知りたい場合は、それを照会する必要があります。

もし、するなら。その場合、SAVE_UPDATEは、ムービーに追加するときに新しいものを作成しません。そうしないと、Hibernateはデータベースに新しいジャンル行を作成し、many_to_manyテーブルへの接続を追加します。

于 2013-01-14T15:26:34.930 に答える