2

我正在使用泽西岛,并且希望将 POST 作为一个实体。然而 thst POST 也将包含UUID其关系之一:

泽西资源:

@POST
public WorkstationEntity save (WorkstationEntity workstationEntity) {
            //WorkflowProcessEntity workflowProcessEntity = workflowProcessService.findByUUID();

    workstationService.save(workstationEntity);
    return workstationEntity;
}

如何调整以下映射以便识别关系并正确保存?目前workflow_process_id保存时为NULL,我必须手动查询实体。

正在发布的 JSON 是...{name: Workstation 1; workflow_process_id: 1}

private WorkflowProcessEntity workflowProcess;

@ManyToOne
@JoinColumn(name = "workflow_process_id", referencedColumnName = "id")
public WorkflowProcessEntity getWorkflowProcess() {
    return workflowProcess;
}

public void setWorkflowProcess(WorkflowProcessEntity workflowProcess) {
    this.workflowProcess = workflowProcess;
}

工作站服务

@Transactional
public void save(WorkstationEntity workstationEntity) {
    workstationRepository.save(workstationEntity);
}
4

2 回答 2

0

如果我理解问题是返回的 json 对于附加的 WorkstationProcessEntity id 字段有一个空 id。当您在返回分离的实体之前尝试持久/合并未提交事务的实体时,这很可能是一个问题。如果您使用持久化,请确保您提交事务,否则 id 将为空。否则,如果您使用合并,这通常会解决问题。

protected T persist(T obj) {
    EntityManager em = ThreadLocalPersistenceManager.getEntityManager();

    EntityTransaction tx = em.getTransaction();
    try {
        if (! tx.isActive()) {
            tx.begin();
        }

        em.persist(obj);
    } finally {
        if (!tx.getRollbackOnly()) {
            tx.commit();
        }
    }

    return obj;
}

另一个可能的原因是您的 fetch 未设置为 eager,因此数据存储区只会在实体被访问时获取实体,而当您从帖子返回时,未附加子实体。这是导致您的问题的最可能原因。您应该尝试在关闭实体管理器之前访问工作站实体 getWorkflowProcess。否则附加的实体将为空。或者添加 FetchType.Eager 注解,在访问父实体时从数据库中获取子实体。

于 2013-04-29T15:38:41.173 回答
0

你能显示代码workstationService吗?你在使用Hibernatr还是简单jdbc或任何其他orm tool

我认为在里面workstationService.save(workstationEntity);你需要附加workstationEntity到会话(在 Hibernate Hibernate Session 的情况下)。然后save它..

于 2013-04-29T15:19:10.973 回答