有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javajackson映射关系

我正在使用Jersey,作为一个实体体验一个帖子。但是,thst POST还将包含其关系之一的UUID

泽西岛资源:

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

    workstationService.save(workstationEntity);
    return workstationEntity;
}

如何调整以下映射,使其能够识别关系并正确保存?当前workflow_process_id在保存时为空,我必须手动查询实体

正在发布的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);
}

共 (2) 个答案

  1. # 1 楼答案

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

    我认为在workstationService.save(workstationEntity);内部,您需要将workstationEntity附加到会话(在Hibernate-Hibernate会话的情况下)。然后save

  2. # 2 楼答案

    如果我理解这个问题,那就是返回的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;
    }
    

    另一个可能的原因是,fetch未设置为eager,因此数据存储仅在访问实体时才会获取该实体,并且在您从post返回时,子实体尚未附加。这是你问题的最可能原因。您应该尝试在关闭实体管理器之前访问工作站实体的getWorkflowProcess。否则,附加的实体将为空。或者添加FetchType。当访问父实体时,从数据库中获取子实体的急切注释