0

私は春と冬眠の両方が初めてなので、答えを考慮してください。

リンクテーブルにも情報が含まれている必要がある多対多の関係があります。私はこれに従ってこれを解決しようとします:

結合テーブルから追加プロパティの多対多 Hibernate マッピングを作成するにはどうすればよいですか?

私の質問は以下に関連しています:

hibernate: 挿入/更新時のカスタム コード

ただし、ここで繰り返しますので、リンクをクリックする必要はありません。

色があるとしましょう。ユーザーは n 色の混合を作成し、その混合をデータベースに保存できます。後でユーザーが色「青」を検索すると、青を含むすべての混合物が表示されます。

ビジネス ルールは、すべての色がデータベースに一度だけ存在する必要があるということです。したがって、新しい混合物が挿入された場合は、すべての色がデータベースに既に存在するかどうかを最初に確認する必要があります。存在する場合はその色を再利用 (参照) し、そうでない場合は新しい色を作成する必要があります。

「青」が「赤」に置き換えられたなどのように混合物が変更された場合、最初の「青」は変更されず、システムは「赤」が存在するかどうかを確認し、それを再利用するか作成してから、混合。

重要な点は、「色」はシステムによって管理され、既存の色を変更してはならないということです。「赤」は常に「赤」であり、「青」に変更することはできません。私はHibernateとSpringを初めて使用するので、このルールをどのように実装するか、どのレベルで実装するかについて少し迷っています。私見では、そのロジックを可能な限り低いレベルに置いて、あなた(開発者)が壊れないようにします。チェックするのを忘れています。それは理にかなっていますか?より良いアイデアや提案はありますか?

4

2 に答える 2

0

だからここに私の現在の解決策:

  1. 色の一意の制約
  2. DAO 更新メソッドで、更新する色がデータベースに既に存在するかどうかを確認します。はいの場合はそれを使用し、そうでない場合は新しいものを作成します
  3. ポイント 2 には、色の変更と更新が同じ休止状態セッションで発生した場合に問題があります。次に、2.で実行されたクエリが更新中の色を常に返すため、その色を赤から青に更新します。@Immutable を Color エンティティ クラスに追加することでこれを解決しました。

2のコード。

public Color update(final Color color) {
    SQLQuery query = this.getCurrentSession().createSQLQuery(
        "select * from colors where color = :color")
        .addEntity(Color.class);        
    query.setString("color", color.getColor());
    Color result = (Color) query.uniqueResult();
    if (result == null) {
        Color newColor = 
                new Color(color.getColor());
        this.getCurrentSession().persist(newColor);
        return newColor;
    } else {
        return (Color) this.getCurrentSession().merge(result);
    }
}
于 2012-10-09T18:09:42.393 に答える
0

色と混合の同じ例を使用できる場合、次のようになります。

public class Color {
  String name;
  List<Mixture> mixtures;
  public String getName() { return name; }
  ...    
}

public class Mixture {
  String name;
  List<Color> colors;
}

したがって、 Color の名前が変更されないようにする最も簡単な方法は、 setter を提供しないことだと思いますsetName。色が決して削除されないようにするのは少し面倒です。ただし、永続化のために DAO メソッドを提供する場合は、メソッドを提供しないでくださいdeleteColor

使用されていない色 (混合物によって参照されていない) を削除できないことが非常に強い要件であるかどうかはわかりません-これによる利点は何ですか? また、参照されるものについては、データベースに参照整合性制約が存在するか、少なくとも存在する必要があります。

于 2012-10-04T10:33:11.660 に答える