我使用 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;
}
首先,我加载 Item
与 genericDAO.find(id)
方法 - 它包含最新的图像列表。然后我加载 Item
在另一个 REST 方法中使用相同的 ID,该方法删除旧图像并添加新图像,更改标题。稍后,如果尝试重新加载 Item
与 genericDAO.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/