0

Questionnaire と QuestionnaireTime という 2 つのエンティティがあります。アンケートの id は QuestionnaireTime の外部キーです。したがって、私の QuestionnaireTime エンティティの関係は次のようになります。

@JoinColumn(name = "questionnaireid", referencedColumnName = "id")
@ManyToOne(cascade = CascadeType.PERSIST)
private Questionnaire questionnaireid;

私がやろうとしているのは、1 つのアンケートに複数の QuestionnaireTime レコードを追加することです。リレーションシップで CascadeType.PERSIST 部分を削除すると、永続化が完了しません。また、カスケードを使用すると、メイン テーブルのアンケートにいくつかの新しいレコードが表示されますが、それは私が望んでいるものではありません。

たとえば、特定のアンケートに 3 つの QuestionnaireTime を追加する場合、3 つのレコードが QuestionnaireTime テーブルに挿入されますが、3+1 レコードもアンケートに追加されます。

さらに説明が必要な場合。これは私の管理対象 Bean であり、1 つのアンケートに複数の QuestionnaireTime レコードを追加しようとしている部分です: NB - 現在は私のアンケート オブジェクトです。

else if (current.getType().equals("frequent")) {
                int iteration = 1;
                currentQuestionnaireTime = new QuestionnaireTime();
                if (!selectDateList.isEmpty()) {
                    for (String insertedDate : selectDateList) {                    
                        currentQuestionnaireTime.setId(0);
                        currentQuestionnaireTime.setQuestionnaireid(current);
                        getEjbQuestionnaireTimeFacade().create(currentQuestionnaireTime);
                        iteration++;
                    }
                }
            }
            try {
                getFacade().create(current); // my Questionnaire facade
            } catch (EJBException ejbe) {
                ejbe.getCause();
            }
4

1 に答える 1

0

いくつかのこと、

questionid - これは非常に不適切なフィールド名です。アンケートは理にかなっています。

currentQuestionnaireTime.setId(0); - 既存のオブジェクトの ID を変更するのではなく、新しいオブジェクトを作成してください。

getEjbQuestionnaireTimeFacade().create() - これは何をしますか? 現在への参照が必要な場合は、最初に現在を永続化する必要があります。EJBリモートなら?そうである場合は、ローカルにするか、または新しいオブジェクトがデタッチされたオブジェクトへの参照を持っているため、persist() ではなく merge() を使用するようにしてください。または、現在の永続化コンテキストで参照を見つけてください。

于 2012-10-11T12:59:05.113 に答える