0

我有一个表单 - 工作流,其中有 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() 方法,但问题仍然存在。

4

1 回答 1

0

你为什么叫合并?工作流是否分离(序列化)?

如果它没有被分离,你不应该调用合并,只是改变对象,它应该被更新。

你应该有一个 setUser 方法,而不是 setUserByUserId?不确定这是如何工作的,也许包括您的完整代码。您的 get/set 方法可能会破坏您的对象,一般来说,注释字段而不是方法更安全,以避免 get/set 方法中的代码导致奇怪的副作用。

确保您没有创建对象的两个副本,您的合并似乎以某种方式执行此操作。启用日志记录并包含 SQL。在合并后直接调用 flush() 将导致立即引发任何错误。

于 2013-04-29T13:33:59.103 回答