杰克逊映射关系

时间:2013-04-18 16:42:25

标签: java json jersey jackson

我正在使用泽西岛,并且我特意将POST作为一个实体。但是,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;
}

workstationService

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

2 个答案:

答案 0 :(得分:0)

你能展示workstationService的代码吗?您使用的是Hibernatr还是简单jdbc还是其他任何orm tool

我认为在workstationService.save(workstationEntity);内你需要将workstationEntity附加到会话(如果是Hibernate Hibernate Session)。然后save它..

答案 1 :(得分:0)

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

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;
}

另一个可能的原因是您的提取未设置为急切,因此数据存储区仅在访问实体时获取实体,并且当您从帖子返回时未附加子实体。这是导致问题的最可能原因。您应该尝试在关闭实体管理器之前访问工作站授权getWorkflowProcess。否则附加的实体将为null。或者,在访问父级时,添加FetchType.Eager批注以从数据库中获取子实体。