Jpa 不应该';t EntityManager#将工作与不可识别的实体合并?

Jpa 不应该';t EntityManager#将工作与不可识别的实体合并?,jpa,merge,jax-rs,entitymanager,Jpa,Merge,Jax Rs,Entitymanager,我正在设计JAX-RSAPI POST /myentities PUT /myentities/{myentityId} 我确实喜欢这个 @PUT @Path("/{myentityId: \\d+}") @Consumes(...) @Transactional public Response updateMyentity( @PathParam("myentityId") final long myentityId, final Myentity myentity) {

我正在设计JAX-RSAPI

POST /myentities
PUT  /myentities/{myentityId}
我确实喜欢这个

@PUT
@Path("/{myentityId: \\d+}")
@Consumes(...)
@Transactional
public Response updateMyentity(
    @PathParam("myentityId") final long myentityId,
    final Myentity myentity) {
    if (!Objects.equal(myentitiyId, myentity.getId())) {
        // throw bad request
    }
    entityManager.merge(myentity);
    return Response.noContent().build();
}
我突然感到好奇,并对自己提出疑问

当客户端调用以下请求时

PUT /myentities/101 HTTP/101
Host: ..

<myentity id=101>
</myentity>
我发现第二次合并有效,并分配了一个新id。 这正常吗?不应该
EntityManager#merge
拒绝该操作吗

这是否意味着任何客户端都可以通过调用

PUT /myentities/<any number>
PUT/myenties/

如果我理解正确,那么是的,这就是合并应该如何工作。
merge
创建实体类的新实例,复制您提供的实体的当前状态(在您的情况下为
device1
),并将该新实例添加到事务中。 因此,新实例被管理,您对旧实例所做的任何更改都不会在事务中更新,也不会通过
flush
-操作传播到数据库

因此,当您使用
entityManager.remove(device1);
从数据库中删除
device1
时,调用
final Device device2=entityManager.merge(device1);
添加它的新副本(使用新ID)数据库。事务中不会跟踪您对
device1
所做的更改,因此在
flush
后,这些更改不会反映在数据库表中。另一方面,事务中将跟踪对
device2
所做的更改

PUT /myentities/<any number>