0

編集:私はケースを結婚式に変更しましたが、ここではまったく同じ状況です。
私はそのようなエンティティ/データベース構造を持っています:グループ<---->ユーザー<------>結婚式。これは、ユーザーが結婚式を持っていることを意味し、結婚式はさまざまな役割とグループを持つ多くのユーザーを持つことができます。サインアップしたユーザーと新しい(結婚式)ユーザーの結婚式を同時に追加しようとしています。以下のコードは、新しい結婚式を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の作成など、すべてを一度に処理したいと思います。

4

0 に答える 0