[解決済み] 多対多のアソシエーションテーブルを追加カラムでマッピングする
質問
私のデータベースには3つのテーブルがあります。 UserとServiceのエンティティは多対多の関係を持っており、以下のようにSERVICE_USERテーブルと結合されています。
ユーザ - サービスユーザ - サービス
SERVICE_USERテーブルには、BLOCKEDカラムが追加されています。
このようなマッピングを行う最良の方法は何でしょうか? これらは私のEntityクラスです。
@Entity
@Table(name = "USERS")
public class User implements java.io.Serializable {
private String userid;
private String email;
@Id
@Column(name = "USERID", unique = true, nullable = false,)
public String getUserid() {
return this.userid;
}
.... some get/set methods
}
@Entity
@Table(name = "SERVICES")
public class CmsService implements java.io.Serializable {
private String serviceCode;
@Id
@Column(name = "SERVICE_CODE", unique = true, nullable = false, length = 100)
public String getServiceCode() {
return this.serviceCode;
}
.... some additional fields and get/set methods
}
私はこの例に従って http://giannigar.wordpress.com/2009/09/04/m ... using-jpa/ 以下は、いくつかのテストコードです。
User user = new User();
user.setEmail("e2");
user.setUserid("ui2");
user.setPassword("p2");
CmsService service= new CmsService("cd2","name2");
List<UserService> userServiceList = new ArrayList<UserService>();
UserService userService = new UserService();
userService.setService(service);
userService.setUser(user);
userService.setBlocked(true);
service.getUserServices().add(userService);
userDAO.save(user);
問題は、hibernateがUserオブジェクトとUserServiceオブジェクトを永続化することです。CmsServiceオブジェクトでは成功しません。
EAGERフェッチを使ってみましたが、うまくいきません。
上記で提供されたマッピングで、私が期待している動作を実現することは可能でしょうか?
追加カラムを持つ多対多の結合テーブルをマッピングする、よりエレガントな方法があるのではないでしょうか?
どのように解決するのですか?
SERVICE_USERテーブルは純粋な結合テーブルではなく、追加の機能フィールド(ブロック)を持っているため、エンティティとしてマッピングし、ユーザとサービスの間の多対多の関連付けを2つのOneToMany関連付けに分解する必要があります。1人のユーザーは多くのユーザーサービスを持ち、1つのサービスは多くのユーザーサービスを持ちます。
最も重要な部分である、エンティティ間の関係のマッピングと初期化(つまり、問題を抱えた部分)を見せてくれていません。そこで、どのように見えるべきかをお見せします。
関係を双方向にする場合、次のようになります。
class User {
@OneToMany(mappedBy = "user")
private Set<UserService> userServices = new HashSet<UserService>();
}
class UserService {
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
@ManyToOne
@JoinColumn(name = "service_code")
private Service service;
@Column(name = "blocked")
private boolean blocked;
}
class Service {
@OneToMany(mappedBy = "service")
private Set<UserService> userServices = new HashSet<UserService>();
}
リレーションシップにカスケードをかけない場合は、すべてのエンティティを永続化/保存する必要があります。リレーションシップの所有者側(ここではUserService側)のみを初期化する必要がありますが、両側のまとまりを確認することも良い練習になります。
User user = new User();
Service service = new Service();
UserService userService = new UserService();
user.addUserService(userService);
userService.setUser(user);
service.addUserService(userService);
userService.setService(service);
session.save(user);
session.save(service);
session.save(userService);
関連
-
同じ識別子値を持つ別のオブジェクトがすでにセッションと関連付けられていました。
-
MappingNotFoundException: resource:**.hbm.xml not found solution for Hibernate
-
org.xml.sax.SAXParseException: ルート要素に先行する文書内のマークアップは,十分にfoでなければならない。
-
引数型[java.lang.String]の名前がない、またパラメータ名情報が
-
同じ識別子値を持つ別のオブジェクトがすでにセッションに関連付けられている場合。
-
LazyInitializationException: ロールのコレクションを遅延して初期化できませんでした。
-
原因:java.lang.ClassNotFoundException: com.mchange.v2.c3p0.ComboPooledDataSource
-
[解決済み】アソシエーションテーブルにフィールドを追加して、多対多で先にコードを作成する
-
[解決済み] 多対多のアソシエーションテーブルを追加カラムでマッピングする
-
[解決済み] エンティティエラーのマッピングで繰り返される別のカラム
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
同じ識別子値を持つ別のオブジェクトがすでにセッションと関連付けられていました。
-
org.xml.sax.SAXParseException: ルート要素に先行する文書内のマークアップは,十分にfoでなければならない。
-
Hibernateのhqlです。INSERT INTO ...のみ SELECT ... 形式のみがサポートされます。
-
引数型[java.lang.String]の名前がない、またパラメータ名情報が
-
LazyInitializationException: ロールのコレクションを遅延して初期化できませんでした。
-
原因:java.lang.ClassNotFoundException: com.mchange.v2.c3p0.ComboPooledDataSource
-
カラム処理方式でデータを切り捨て
-
org.springframework.dao.DataIntegrityViolationException の解決策について
-
[解決済み] 多対多のアソシエーションテーブルを追加カラムでマッピングする
-
[解決済み] エンティティエラーのマッピングで繰り返される別のカラム