私はフォームを持っています-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() メソッドを使用していませんが、それでも問題は解決しません。