我有一个表单 - 工作流,其中有 wfName、assignedUser、dueDate、turnAroundTime 等字段。等等
它由实体 Workflow 支持,并以多对一的形式引用 User 实体。
当对assignedUser 字段(它是一个电子邮件地址)进行更改并提交表单时,我在USER 实体上收到一个唯一约束违规错误。
我不是想达到这个目的。我只想替换工作流实体中的用户。
保存功能由具有扩展持久性上下文的有状态会话 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()。
@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() 方法,但问题仍然存在。