gpt4 book ai didi

java - 为什么 OpenEntityManagerInViewFilter 不执行脏检查?

转载 作者:行者123 更新时间:2023-12-01 05:12:54 25 4
gpt4 key购买 nike

我在 Spring MVC Controller 中使用 JPA 延迟加载(但它可能是一个随意的 servlet)。我发现一个 Book 实体与 Author 具有 @ManyToOne 惰性关系。

@Entity
public class Book extends BaseEntity {
private String isbn;
private String title;

@ManyToOne(fetch= FetchType.LAZY)
private Author author;

private int price;

SpringMVC Controller 对其进行查找(为了示例,我简化了代码):

@Controller
public class EditBookController {

@Autowired BookDao bDao;

@RequestMapping(value={"/updatebook"})
public String updateBook(@RequestParam("id")Long id) {
Book book = bDao.find(id);
System.out.println( book.getAuthor().getFirstName() ); // Lazy loading FAIL
return “bookView”;
}

BookDao.find() 在其祖先 BaseRepository 中定义:

@Transactional
@SuppressWarnings("unchecked")
public class BaseRepository<E extends BaseEntity> {
Class entityClass;

public E find(Long id){
return ( E ) em.find( entityClass, id );
}

当然,它会在 Controller 中触发 LazyInit 异常。因此,我添加了过滤器 OpenEntityManagerInViewFilter 并且它工作正常:书籍实体不再在 Controller 中分离。

现在,我想在 Controller 中修改这本书。例如,我调用 book.setPrice(4);

@RequestMapping(value={"/updatebook"})
public String updateBook(@RequestParam("id")Long id) {
Book book = bDao.find(id);
System.out.println( book.getAuthor().getFirstName() ); // Lazy loading OK
book.setPrice(4);
return “bookView”;
}

我希望 Hibernate 进行脏检查,检测到该书的值已更改,然后保存它。当关闭 EntityMangager 时,它会由 OpenEntityInViewFilter 触发。

但是我的(非分离的)托管实体不会触发对数据库的更新,除非我明确调用 em.merge(book)。

有人可以向我解释一下为什么在这种情况下脏检查没有激活吗?非常感谢!

Spring v3.1.2Hibernate v4.1.4

最佳答案

您使用什么来管理交易?

如果 spring 正在管理它们,那么您需要在 Controller 方法中添加@Transactional。 @Transactional 注释用于划分事务开始的位置,因此您遇到的问题是 spring/hibernate 不知道 updateBook() 返回时需要保留任何更改。 OpenEntityManagerInViewFilter 不提交事务(但您可能想编写自己的实现来进行提交)。

在我看来(其他人可能不同意),用 @Transactional 注释应用程序的入口点是一个很好的做法,它们可能是 Controller 、JMS 消费者或其他任何东西。

关于java - 为什么 OpenEntityManagerInViewFilter 不执行脏检查?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11797948/

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