java - Hibernate 不会完全刷新实体子项

标签 java hibernate rest jpa entitymanager

我使用 Hibernate 5.1.0.Final。我的GenericDAO类主要方法:

public T save(T entity) {
    entityManager.getTransaction().begin();
    entityManager.persist(entity);
    entityManager.getTransaction().commit();
}

public T find(Long entityId) {
    T e = (T) entityManager.find(type, entityId);
    entityManager.refresh(e);
    return e;
}

我有 Item包含 List<Image> images 的实体.

@Entity
@Table(name="item")
public class Item extends GenericEntity {

    @Column(name="title")
    String title;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "item", cascade = {CascadeType.ALL}, orphanRemoval = true)
    @NotFound(action = NotFoundAction.IGNORE)
    List<Image> images;

    @Version
    @Temporal(TemporalType.TIMESTAMP)
    @Column(name="version")
    Date version;

}


@Entity 
@Table(name="image")
public class Image extends GenericEntity {

    @ManyToOne
    @JoinColumn(name="item")
    Item item;

    @Column(name="image_name")
    String imageName;

}

首先,我加载 ItemgenericDAO.find(id)方法 - 它包含最新的图像列表。然后我加载 Item在另一个 REST 方法中使用相同的 ID,该方法删除旧图像并添加新图像,更改标题。稍后,如果尝试重新加载 ItemgenericDAO.find(id)在第一个 REST 方法中,我得到了过时的图像 - 在 Item 时它们没有被再次选中标题被正确检索。

如何从数据库中获取完全刷新的实体及其子项?

最佳答案

您缓存 entityManagers 的方式是正确的,因为在 request 范围内,但您会注意到它有副作用。
你用的是Hibernate的一级缓存。
为什么不按事务使用不同的 entityManager 实例?
根据用户请求实例化 EntityManager 应该不会很昂贵。

如果要缓存 entityManager,entityManager.refres‌ h(e) 似乎还不够,因为它似乎没有清除一级缓存。所以,如果你想清除一级缓存,你应该尝试清除persistenceContext。不能保证,但您可以尝试:entityManager.clear()

就个人而言,我更喜欢按事务使用唯一的 entityManager 实例的解决方案。它价格便宜且设计清晰。

关于java - Hibernate 不会完全刷新实体子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38974925/

相关文章:

java - 无法获取泛型 ResponseEntity<T>,其中 T 是泛型类 "SomeClass<SomeGenericType>"

java - 使用 for 循环和 spring mvc + hibernate 插入记录

java - org.h2.jdbc.JdbcSQL异常 : Table "ALL_SEQUENCES" not found

asp.net-mvc - .Net Web API 为 404/400 响应抛出异常/返回响应/返回错误响应?

java - 如何从指定索引开始删除数组列表中的元素

java - 当我们在 hibernate 中获取 ="join"和 lazy ="true"时会发生什么

web-services - RESTful Web 服务的最终用户身份验证

java - 如何将 Postgresql 大对象 API 与 Spring JdbcTemplate 结合使用

java - 我的按钮未显示在 Android Studio 中

java - 简单测试中的 NoClassDefFoundError