【发布时间】:2014-10-14 22:34:18
【问题描述】:
我正在学习 JPA,并尝试在 Spring MVC Web 应用程序中使用它。我需要实现一个删除对象/记录的方法。目前,我有以下方法的实现:
@Transactional
public void deleteProduct(int productId, int productVersion) {
Product product = entityManager.find(Product.class, productId);
product.setVersion(productVersion);
entityManager.remove(product);
}
productVersion 用于乐观锁定。它是来自 Web GUI 的对象/记录的旧版本。
该方法删除DB中的记录,但是当DB中记录的版本与productVersion不匹配时不会抛出异常。 (我只有 删除 对象有问题:当我 更新 带有 entityManager.merge(product) 的记录时,我收到一条异常消息:Row was updated or deleted by another transaction。)
Hibernate 生成以下 SQL 查询:delete from Product where id=? and version=?,即它会尝试检查 version 字段。
我做错了什么?
另外,通过 id 删除对象是正确的方法吗?我担心我的方法生成了两个 SQL 查询:SELECT 用于entityManager.find(),DELETE 用于entityManager.remove()。有没有更优化的删除对象/记录的方法?
产品类别
@Entity
public class Product {
@Id
@GeneratedValue
protected int id;
protected String name;
protected BigDecimal price;
@Version
protected int version;
// getters and setters
}
【问题讨论】:
-
您的问题标签表明您正在使用 Hibernate 和 Spring。那是对的吗?如果是这样,您为什么不使用会话工厂之类的东西让您的 ORM 生活更轻松?
-
你想要实现什么行为?您希望删除始终成功还是仅在版本匹配时才成功删除?
-
@MrPixelDream 是的,我使用 Hibernate 和 Spring。我使用 JPA,因为它是 Java EE 的一部分。我无法切换到纯 Hibernate。
-
@VarunPhadnis 当前方法总是删除记录。我希望它在版本不匹配时抛出异常。
标签: spring hibernate spring-mvc jpa