【发布时间】:2021-11-19 10:25:18
【问题描述】:
我无法理解为什么JPA delete 不起作用。这是我的父实体:
public class RoleEntity {
//...other attributes like name etc.
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
@JoinColumn(name = "role_id", referencedColumnName = "id", nullable = false, insertable = false, updatable = false)
private Set<RoleExtEntity> extensions;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "file_id", referencedColumnName = "id", nullable = false)
private FileEntity fileEntity;
}
RoleRepository:
@Repository
public interface RoleRepository extends JpaRepository<RoleEntity, Long> {
@Transactional
int deleteByFileEntityAndName(FileEntity fileEntity, String roleName);
}
我正在尝试使用FileEntity 和RoleName 属性删除RoleEntity。 delete 查询返回 val = 1 但是当我再次执行 findBy 时,它给了我记录而不是 null(因为我认为记录应该被删除,父子节点都应该被删除)。
FileEntity fileEntity = fileRepository.findByFolderId(id);
RoleEntity roleToBeDeleted = roleRepository.findByFileEntityAndName(fileEntity, roleName);
int val = roleRepository.deleteByFileEntityAndName(fileEntity, roleName);
RoleEntity doesroleExistEntity = roleRepository.findByFileEntityAndName(fileEntity, roleName);
我已经尝试了这个平台上提到的各种解决方案,比如使用:
orphanRemoval = true-
@Transactional注解 flush()CascadeType.ALL
但是,它们似乎不起作用。有人可以让我知道我在这里做错了什么吗?谢谢!
更新:问题是我在代码中从持久性服务调用了错误的方法。该方法是 readOnlyTransaction(),它不允许我执行删除操作,因此我不得不使用另一种方法 withTransaction() 解决了我的问题。
【问题讨论】:
-
它仍在一级缓存中,您正在获取缓存的实例。假设这是从本身是事务性的服务方法调用的,则在事务提交之前不会删除任何内容。此外,
deleteByFileEntityAndName实际上只会创建一个delete查询,它不* 使用元数据删除其余部分,只有在您自己执行delete(RoleEntity)时才会这样做。跨度> -
@M.Deinum 我也试过
RoleEntity roleToBeDeleted = roleRepository.findByFileEntityAndName(fileEntity, roleName); roleRepository.delete(roleToBeDeleted);,但它不起作用。我是JPA的新手,所以如果您能详细说明如何提交交易会很有帮助? -
如果您在删除后立即再次查询,它仍然会存在于一级缓存中。如前所述,它只会在事务提交后被删除。假设您使用
@Transactional,这将在服务方法执行后自动执行。您应该在 tx 提交后检查数据库,而不是在事务内部。 -
@M.Deinum 我已经在控制台上启用了记录 SQL 查询,但尽管调用了
delete()或deleteBy..(),我根本看不到删除查询。知道为什么会这样吗?
标签: spring spring-data-jpa spring-data