編集:私はケースを結婚式に変更しましたが、ここではまったく同じ状況です。
私はそのようなエンティティ/データベース構造を持っています:グループ<---->ユーザー<------>結婚式。これは、ユーザーが結婚式を持っていることを意味し、結婚式はさまざまな役割とグループを持つ多くのユーザーを持つことができます。サインアップしたユーザーと新しい(結婚式)ユーザーの結婚式を同時に追加しようとしています。以下のコードは、新しい結婚式をdbに挿入しますが、結婚式の新しいユーザーは挿入しません。その目的のためにメソッドを呼び出すだけで新しいユーザーを追加しようとすると(dbとは異なるトランザクション)、新しいユーザーを取得してそれに結婚式をします。その後、currentUserをマージしようとしましたが、currentUser /signupuserのweddingIDはまだnullでした。醜いコードですが、あなたが生き残ることができることを願っています!
ユーザー-エンティティ:
@JoinColumn(name = "wedding_wedding_id", referencedColumnName = "wedding_id")
@ManyToOne (cascade= CascadeType.ALL)
private Wedding weddingWeddingId;
@ManyToMany(mappedBy = "usersCollection")
private Collection<Groups> groupsCollection;
結婚式-エンティティ
@OneToMany(mappedBy = "weddingWeddingId",cascade=CascadeType.ALL)
private Collection<Users> usersCollection;
ユーザーコントローラー:
public String createWeddingAndWeddingUser() {
Users weddingUser = null;
List<Users> usersCollection = (List<Users>) currentUser.getWeddingWeddingId().getUsersCollection();
//Creates wedding and wedding user, one username and password for all guests
if (currentUser.getHasGuestUsers() == Boolean.TRUE && currentUser.getWeddingWeddingId() != null) {
// We are using Transient property
weddingUser = currentUser.getWeddingWeddingId().getGuestUsers();
//Fetching group for User-group. Table: Groups
FacesContext context = FacesContext.getCurrentInstance();
GroupsController groupsC = (GroupsController) context.getApplication().evaluateExpressionGet(context, "#{groupsController}", GroupsController.class);
Groups userGroup = null;
try {
// Group 3 is group for users
userGroup = groupsC.getGroupByGroupId(new Integer(3));
} catch (Exception e) {
JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("resources/Bundle").getString("PersistenceErrorOccured"));
return null;
}
Collection groupCollection = new ArrayList<Groups>();
groupCollection.add(userGroup);
weddingUser.setGroupsCollection(groupCollection);
// Both user must have the same wedding, first one is admin and another one is user
weddingUser.setWeddingWeddingId(currentUser.getWeddingWeddingId());
weddingUser.setFirstName(weddingUser.getUsername());
weddingUser.setLastName(weddingUser.getWeddingWeddingId().getName());
if (usersCollection == null) {
usersCollection = new ArrayList<Users>();
} else {
usersCollection.add(weddingUser);
usersCollection.add(currentUser);
}
currentUser.getWeddingWeddingId().setUsersCollection(usersCollection);
try {
// Should update the "master" user and create a new user and a wedding
currentUser = getFacade().mergeUser(currentUser);
JsfUtil.addSuccessMessage(ResourceBundle.getBundle("resources/Bundle").getString("WeddingAndUserCreated"));
return "View";
} catch (Exception e) {
JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("resources/Bundle").getString("PersistenceErrorOccured"));
return null;
}
} else {
if (usersCollection == null) {
usersCollection = new ArrayList<Users>();
}
usersCollection.add(currentUser);
currentUser.getWeddingWeddingId().setUsersCollection(usersCollection);
try {
// Edit is same than MERGE
getFacade().edit(currentUser);
JsfUtil.addSuccessMessage(ResourceBundle.getBundle("resources/Bundle").getString("WeddingCreated"));
} catch (Exception e) {
JsfUtil.addErrorMessage(e, ResourceBundle.getBundle("resources/Bundle").getString("PersistenceErrorOccured"));
return null;
}
}
return "View";
}
それ以外のブロックは正常に機能しています。currentUserに新しい結婚式を追加するだけで、すべてが正常に機能しています。
パーティーや結婚式などを更新するときは、上位のエンティティ(ユーザー)を使用することにしました。たとえば、ユーザーが結婚式を追加するとき、私は単にMERGEUSERと呼びます。
あなたはどう思いますか、私はケース全体を分割する必要がありますか?最初にパーティー/結婚式を追加するだけでIDを取得した場合。その後、結婚式を取得し、DBから自動インクリメントIDを取得します。次に、サインアップユーザーをマージして、結婚式への参照を取得します。その後、新しいユーザーを作成し、それに結婚式のIDを挿入しますか?JPAはそれを回避するためだけのものだと思うので、とてもダミーに聞こえますが、私は正しいですか?そういう意味では読み書きが多いのですが…その場合は不要だと思います。結婚式、currentuser(admin)の更新、weddingUserの作成など、すべてを一度に処理したいと思います。