1

この質問は私を殺しています:

したがって、この非常に単純なケースを考えてみましょう。

(spring / Hibernate / jpa2 / @ PersistenceContext(type = PersistenceContextType.TRANSACTION))

DAOエンティティがあります:

class User{
private Set<Car> carSet;
... usual setters + getters
}

class Car{
private User user;
... usual setters + getters

}

次のうち、carIdで車を削除するための推奨される方法とその理由(これはhttp postリクエストで実行され、この削除以外の操作は実行されません)?

1)簡単な削除操作。

Car  car = dao.find(Car.class, carId);
dao.remove(car);

2)最初に参照をクリーンアップします。この方法はいつ推奨されますか?

Car  car = dao.find(Car.class, carId);
car.getUser().getCarSet().remove(car); // this one as far as I know will usually fetch the other cars, and I think is not optimal, am I right?
car.setUser(null);
dao.remove(car);

前もって感謝します

4

2 に答える 2

2

CarがUserを指しているように見えます。つまり、CarにはUserを指す外部キープロパティがあります。したがって、Carを削除すると、Userへの参照も削除されます。これにより、ユーザーの車セットから車も削除されます。したがって、オプション1はあなたがする必要があるすべてです。

于 2012-08-30T18:45:29.060 に答える
1

つまり、関係の所有側に依存します。

簡単にするために、ダミーのルールを想定してみましょう: 所有側は常に外部キーを持つ側です (全体の話については、Pro JPA 2: Mastering the Java™ Persistence APIなどの優れた本をお勧めします)。からまでの@ManyToOne関係があるため、ダミーのルールにより、が所有側になります。CarUserCar

   *---------------*       *--------------*     
   |      CAR      |       |     USER     |     
   *---------------*       *--------------*     
   |  CARD_ID (PK) |   ~-> | USER_ID (PK) |     
   |  USER_ID (FK) | --~   *--------------*     
   *---------------*       

所有側を削除する場合は、他に何もする必要はありません。

あなたの場合、車は所有側であるため、単に車を削除できます。つまり、dao.remove(car);十分です。

次に、逆の状況について考えてみましょう。Usera 、つまり参照側を削除する必要があるとしましょう。

車が関連付けられているユーザーを削除すると (カスケード動作が行われていないと仮定して)、DELETEFK 違反のためにデータベース操作が失敗します。

つまらないルールは次のとおりです。関係の維持はアプリケーションの責任です。これは、関係の反対側 (所有側) で参照を調整することを意味します。

car テーブルの外部キー列を使用できる場合は、ユーザーを削除する前にNULL使用できます。car.setUser(null);これにより、孤立した車がデータベースに残ります。

外部キー列が の場合NOT NULL、ユーザーを削除する前に、車を別のユーザーに関連付ける必要があります。

   car.setUser(anotherUser);

または、データベースから車をまとめて削除します。

   dao.remove(car);

私が言ったように、関係の維持にはそれ以上のものがあります。@CascadeTypeJPAにはsなどの機能があります。@ManyToMany所有側を任意に選択できる双方向の関係。単方向@OneToMany(結合テーブルを使用)など。しかし、これで基本をほぼ要約できると思います。

于 2012-08-30T21:07:56.990 に答える