gpt4 book ai didi

java - 使用 spring data jpa 存储库在 Hql 查询后刷新()

转载 作者:行者123 更新时间:2023-12-02 09:34:03 24 4
gpt4 key购买 nike

我正在 spring data jpa 存储库中使用 @Query 注释编写一些 hql 查询。我知道我可以使用存储库接口(interface)中的方法,但出于学习目的,我明确地编写了它们。

这是我的主类(class)

@SpringBootApplication
public class Main implements CommandLineRunner {

@Autowired
PersonRepository personRepository;

public static void main( String[] args ) {
SpringApplication.run(Main.class, args);
}

/**
* if we delete the transactional annotation-> we get an exception
*/
@Override
@Transactional
public void run( String... args ) throws Exception {
saveOperation();
deleteOperationUsingHql();
}

private void saveOperation() {
Person p = new Person("jean", LocalDate.of(1977,12,12));
personRepository.save(p);
}

private void deleteOperationUsingHql() {
personRepository.deleteUsingHql(1L);
personRepository.flush();
Optional<Person> p = personRepository.findById(1L);
if (p.isPresent()){
System.out.println("still present");
}
}
}

我的personRepository接口(interface)

public interface PersonRepository  extends JpaRepository<Person, Long> {

@Query(value = "select p from Person p where p.id=?1")
List<Person> getById( Long id);

@Modifying
@Query(value = "delete from Person p where p.id=:id")
void deleteUsingHql( Long id );
}

人员类别

@Entity
@Table(name = "Person")
public class Person {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;
private LocalDate date;

// constructors,getters...omitted for brievety
}

一切都运行良好,但是对于deleteOperationUsingHql(),即使我从数据库中删除了这个人,即使我将修改刷新到数据库,id=的人findById(1L) 方法仍返回 1。我应该怎么做才能使 findById(1L) 返回空的Optional。

我的第二个问题是关于@Transactional注释,我知道它的详细工作原理,但我不知道为什么如果我们删除它,我们会得到以下异常

Caused by: javax.persistence.TransactionRequiredException: Executing an update/delete query

有人可以解释为什么我在删除 @Transactional 时遇到此异常吗?

最佳答案

even If I deleted the person from the database and even if I flush the modification to the database, the person with id=1 is still returned by the findById(1L) method

这是正常的,因为您使用查询来删除人员,而不是实际使用存储库(以及 EntityManager)删除方法。查询完全绕过 session 缓存,因此 Hibernate 不知道此人已被删除,并返回其缓存中的实例。解决方案:不要使用查询。替代解决方案,删除后清除缓存(例如,将 Modifying 注释的 clearAutomatically 标志设置为 true)。

Could someone explains why I'm getting this exception when @Transactional is removed.

因为当@Transactional被移除后,在执行该方法之前,SPring不会启动任何事务,并且从错误消息中可以看到,删除查询必须在事务内执行。

关于java - 使用 spring data jpa 存储库在 Hql 查询后刷新(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57696473/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com