Jpa 不应该';t EntityManager#将工作与不可识别的实体合并?
我正在设计JAX-RSAPIJpa 不应该';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) {
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>