0

私はフォームを持っています-wfName、assignedUser、dueDate、turnAroundTimeなどのフィールドがあるワークフロー。等

これは、User エンティティを多対 1 として参照するワークフロー エンティティによって支えられています。

assignedUser フィールド (電子メール アドレス) を変更してフォームを送信すると、USER エンティティで一意制約違反エラーが発生します。

私はこれを達成しようとしていません。ワークフロー エンティティのユーザーのみを置き換えたい。

保存機能は、EXTENDED 永続コンテキストを持つステートフル セッション Bean によって実行されます。

ここで何か不足していますか?これは、参照フィールドの情報を更新する正しい方法ですか?

私がやっている更新されたユーザーを設定している間

User user = workflow.getUser();
//This user has its email address changed on the screen so getting a fresh reference of the new user from the database.
user = entitManager.createQuer("from User where email_address=:email_address").setParameter("email_address", user.getEmailAddress).getSingleResult();
//This new found user is then put back into the Workflow entity.
workflow.setUser(user);
entityManager.merge(workflow);

これらの行が実行された時点では例外はスローされませんが、後でログで例外がスローされたことがわかります

Caused by: java.sql.SQLException: ORA-00001: unique constraint (PROJ.UK_USER_ID) violated

エンティティにカスケード構成はありません。

エンティティの関連付けコードは次のとおりです - ワークフロー - ユーザー関係

    @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USER_ID", nullable = false)
@NotNull
public GwpsUser getUser() {
    return user;
}

public void setUserByUserId(User user) {
    this.user = user;
}

ユーザーとワークフローの関係

@OneToMany(fetch = FetchType.LAZY, mappedBy = "User")
public Set<Workflow> getWorkflowsForUserId() {
    return workflowsForUserId;
}

public void setWorkflowsForUserId(
        final Set<Workflow> WorkflowsForUserId) {
    this.workflowsForUserId = workflowsForUserId;
}

SFSB には、loadWorkflow() と saveWorkflow() の 2 つのメソッドがあります。

    @Begin(join = true)
    @Transactional
    public boolean loadProofData(){

//Loading the DataModel here and the conversation starts
}

flushMode = FlushModeType.MANUAL@Begin 内に追加すると。saveWorkflow() メソッドは、初回のみ、データを適切に保存します。さらに変更を加えたい場合は、別の場所に移動してから、このページに戻る必要があります。

saveWorkflow() メソッドは次のようになります

@SuppressWarnings("unchecked")
    public boolean saveWorkflow() throws FileTransferException {
//Do some other validations
for (Workflow currentWorkflow : workflowData) {
    User user = currentWorkflow.getUser();
//This user has its email address changed on the screen so getting a fresh reference of the new user from the database.
user = entitManager.createQuery("from User where email_address=:email_address").setParameter("email_address", user.getEmailAddress).getSingleResult();
//This new found user is then put back into the Workflow entity.
currentWorkflow.setUser(user);
}
//Do some other things
}

ここでは merge() メソッドを使用していませんが、それでも問題は解決しません。

4

1 に答える 1

0

なぜマージを呼び出すのですか?ワークフローは分離 (シリアル化) されていますか?

デタッチされていない場合は、マージを呼び出す必要はなく、オブジェクトを変更するだけで更新する必要があります。

setUserByUserId ではなく、setUser メソッドが必要ですか? これがどのように機能しているのかわからない場合は、おそらく完全なコードを含めてください。get/set メソッドがオブジェクトを破損している可能性があります。一般に、メソッドの代わりにフィールドに注釈を付けて、get/set メソッドのコードが奇妙な副作用を引き起こすのを避ける方が安全です。

オブジェクトの 2 つのコピーを作成していないことを確認してください。マージが何らかの形でこれを行っているようです。ロギングを有効にし、SQL を含めます。マージの直後に flush() を呼び出すと、エラーがすぐに発生します。

于 2013-04-29T13:33:59.103 に答える