【问题标题】:Jackson mapping a relationship杰克逊映射关系
【发布时间】:2013-04-11 21:43:14
【问题描述】:

我正在使用 Jersey 并且希望将 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);
}

【问题讨论】:

  • 你能显示workstationService的代码吗?你使用的是 Hibernet 还是简单的 jdbc 或任何其他 orm 工具
  • 我很确定我可以帮助你,因为我广泛使用了 jpa、jersey 和 jackson,但我不明白你的问题。你想完成什么。
  • @ChrisHinshaw - 当 json 映射到对象时,是否可以将“user:{id:4}”映射为 JPA 用户实体,而不是具有填充 ID 列的用户对象?
  • 是的,但您必须使用实体管理合并操作将实体重新附加到实体管理器。 AFAIK 这是从 POJO 到托管实体的推荐方式。您可能可以通过为您的实体使用 jackson mixin 来自动执行此操作。

标签: java json jersey jackson


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果我理解问题是返回的 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 注解,在访问父实体时从数据库中获取子实体。

    【讨论】:

    • 我建议在添加 fetchtype.eager 时使用 servlet 过滤器进行 REST 操作,这将确保附加访问的子级。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 2012-10-01
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    相关资源
    最近更新 更多