0

我有一个 REST Web 服务 API。我使用 JPA 映射数据库。我有一个实体“角色”。使用 POST 方法添加新实体可以正常工作,GET 方法也可以正常工作,但是当我尝试调用 PUT 方法时,我在调试时发现了一些异常:“无法抑制空异常。” 和“不允许自我抑制”。在具有其他实体的测试数据库中,一切正常...在我的情况下添加几乎与编辑一样 - 首先我只获取值,然后在更改后我做所有相同的事情,唯一的区别是使用了 PUT 方法而不是 POST。

这是我的 PUT 方法(这里发生异常):

 @PUT
@Consumes({"application/xml", "application/json"})
public Response edit(Persona entity) {
    try {
        getJpaController().edit(entity);
        return Response.ok().build();
    } catch (Exception ex) {
        return Response.notModified(ex.getMessage()).build();
    }
}

我是第一次使用网络服务,所以我是新手。

这种行为的原因是什么?这是什么自我抑制错误?

如果您需要其他任何源代码,请告诉我,我将编辑我的帖子。

@编辑:

我在 JpaController 类中发现了一些异常,我的 Persona 类有:

@OneToOne(cascade = CascadeType.ALL, mappedBy = "persona")
    private Personaacceso personaacceso;

在 JpaController 中有:

Personaacceso personaaccesoOld = persistentPersona.getPersonaacceso();
            Personaacceso personaaccesoNew = persona.getPersonaacceso();

if (personaaccesoOld != null && !personaaccesoOld.equals(personaaccesoNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain Personaacceso " + personaaccesoOld + " since its persona field is not nullable.");
            }

因此,显示一条消息,我必须保留 Personaacceso。知道如何解决吗?

4

1 回答 1

0

好的,我现在知道是什么原因了...

每个 Persona 实体都有一些其他实体(一对一或一对多)。Jpa 控制器没有保留所有这些包含实体(相反,它正在创建新实体)。因此,数据丢失了,并且由于该角色实体没有被编辑。

解决方案:对每个包含实体执行以下操作:

containedEntityNew=containedEntityOld;

但是,请考虑到,这些实体字段只是从旧的“主”实体重写。

于 2012-09-17T09:29:02.987 回答