2

たとえば、次の 2 つのエンティティを見てみましょう。

街 :

<class name="City" table="city">
    <id name="id" column="id"/>
    <property name="city_name" column="city_name"/>
    <property name="country_name" column="country_name"/>
</class>

人 :

<class name="Person" table="person">
    <id name="id" column="id"/>
    <property name="name" column="name"/>    
    <many-to-one cascade="save-update" name="city" column="city_id" class="City"/>
</class>

City.equals()実装は、とが同じtrue場合に戻ります。city_namecoutry_name

Person1回のセッションで2つ保存した場合:

Person person1 = new Person("Peter");
Person person2 = new Person("John");

City city1 = new City("Paris", "France");
City city2 = new City("Paris", "France");

person1.setCity(city1);    
person2.setCity(city2);

session.save(person1);
session.save(person2);

Hibernate は次のレコードを生成します。

街 :

| id |  name  | city_id |
-------------------------
| 1  |  Peter |    1    |
| 2  |  John  |    2    |

人 :

| id |  city_name | country_name |
----------------------------------
| 1  |    Paris   |    France    |
| 2  |    Paris   |    France    |

しかし、Hibernatecity_idpersonwhenで同じものを再利用するように指示できcityX.equals(cityY)ますか?

編集 :

city1をと同じインスタンスにすることはできないことを明確にする必要がありましcity2た。簡潔にするために、私が直面している問題をすべて説明することはできません。実際のケースでは、テーブルに重複要素が含まれる可能性があります。特定の要素をグループ化してスペースを節約しようとしています。ありがとうございました!

4

5 に答える 5

0

市は実体であり、その平等はそのアイデンティティに依存しています。2 つの異なる都市を 2 人の人物に関連付ける限り、2 人の人物になります。

これを回避するには、都市オブジェクトが存在しない場合にのみ作成し、それ以外の場合は既存のものを使用する必要があります。

また問題: 同じ国の 2 つの都市がたまたま同じ名前だったらどうなるでしょうか? それらは同じ都市ではありませんが、同じアイデンティティを共有します。

于 2014-07-01T19:51:18.190 に答える
0

単一のCityオブジェクトを作成し、同じオブジェクトを両方のエンティティに割り当てます。City最初にこのオブジェクトを永続化して、既存のオブジェクトとの関連付けが行われるようにする必要があります。

ここに落とし穴があります。

両方のインスタンスに同じ値を割り当てているためPerson、カスケードを実際に行うべきではありませんが、Cityをドロップした後に孤立する場合は を削除する必要がありPersonます。

特定のケースでは、都市を扱っているため、 Peterを削除した後Personに3 番目の都市を作成する場合に備えて、既存の都市を新しい人に割り当てることができるようにするために、多くの都市を含む既存のテーブルを使用することをお勧めします。とジョンParis

于 2013-07-08T16:28:15.650 に答える
0

city_name と country_name を主キーにすることをお勧めします。したがって、この状況では、データベースに同じ値を挿入することはできません。お気に入り..

City city1 = new City("Paris", "France");
City city2 = new City("Paris", "France");

したがって、同じ値を持つ都市オブジェクトが 1 つ必要です。その後、重複しません。

equals() メソッドに従って hashCode() をオーバーライドすることを忘れないでください。

于 2013-07-08T16:52:42.823 に答える
0

これを試して:

Person person1 = new Person("Peter");
Person person2 = new Person("John");

City city1 = new City("Paris", "France");

person1.setCity(city1);    
session.save(person1);
person2.setCity(city1);
session.save(person2);
于 2013-07-08T16:30:34.700 に答える
0

別のことを考えているかもしれませんが、これをどのように処理するかを次に示します。

  1. まず、city テーブルの次のフィールド (city_name、country_name) に一意のインデックスを配置します。
  2. もちろん、この一意のインデックスについて Hibernate に知らせます。
  3. City city1 = new City("Paris", "France")私がする代わりに

    //use session.createQuery or createCriteria here  
    City city = findByNameAndCountry("Paris", "France")   
    if (city == null){  
        city = new City("Paris", "France");  
        session.save(city)  
    }  
    
于 2013-07-08T16:31:06.000 に答える