更新实体通过ID使用瞬态的实例

所以我有一个以下情况:更新实体通过ID使用瞬态的实例

我有拥有吨领域的客户实体(20)。客户 类看起来是这样的(我刚上市前几个字段):

@Entity 

public class Customer {

@Id

@GeneratedValue

private long id;

@Version

private version version;

private String firstName;

private String lastName;

private String email;

.

.

.

}

现在我应该通过接收它的所有更新客户的方法是价值低谷RESTful Web服务。该服务方法看起来是这样的:

@PUT 

@Path("{id}")

@Consumes("application/json")

@Produces("application/json")

public Response editCustomer(@PathParam("id") long id, Customer customer) {

return FacadeUtils.buildResponse(updateCustomer(customer, id));

}

而且我updateCustomer看起来是这样的:

public Result updateCustomer(Customer customer, long id) { 

@PersistenceContext

private EntityManager em;

customer.setId(id);

em.merge(customer);

.

.

.

}

然而,当我尝试执行更新,我得到以下异常:

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) 

我知道我可以通过使用oldCustomer = em.find(Customer.class, id);将对象加载到持久性上下文中,然后使用oldCustomer.setXXX(customer.getXXX);设置所需的所有值

但是,由于我有很多字段需要更新(有时候所有的20个字段都会更改,所以这样做并不合适。

我知道我可以尝试使用Reflections或Apache Bean Utils来复制字段,但必须有一些更优雅的解决方案。有任何想法吗?

回答:

我认为这里的主要问题是版本字段,您需要一个有效的版本值才能正确合并。您可以让其余的呼叫通过它以前收到的版本值。

以上是 更新实体通过ID使用瞬态的实例 的全部内容, 来源链接: utcz.com/qa/259106.html

回到顶部