java - 我们如何使用休眠更新实体的所有引用?
问题描述
有没有办法随时更新通过休眠加载到我们程序中的实体的所有引用?
例如,我在 A 类中加载了 ID 为“1”的产品,并在 B 类中更改了 ID 为“1”的同一产品的新加载。但 A 类中的产品没有改变。我应该如何解决这个问题?
这是代码的一部分:产品类:
@Entity
@Table(name = "t_product")
public class Product {
@Setter(AccessLevel.NONE)
@Id @GeneratedValue @Column(name = "ID")
private int id;
...
@ElementCollection
@OneToMany(targetEntity = SellerIntegerMap.class,
fetch = FetchType.EAGER,
cascade = CascadeType.ALL)
@JoinTable(name = "t_product_stock")
private List<SellerIntegerMap> stock;
...
}
卖方整数地图:
@Entity
@Table(name = "t_map")
public class SellerIntegerMap{
@Setter(AccessLevel.NONE)
@Id @GeneratedValue
private int id;
@ManyToOne
@JoinColumn(name = "SELLER")
private Seller seller;
@Column(name = "INTEGER_VALUE")
private Integer integer;
}
数据库管理器:
public class DBManager {
public static <T> T load(Class<T> type, Serializable serializable){
Session session = HibernateUtil.getSession();
session.beginTransaction();
T object = session.get(type,serializable);
if (object == null){
}
session.evict(object);
session.getTransaction().commit();
return object;
}
public static void save(Object object){
Session session = HibernateUtil.getSession();
session.beginTransaction();
session.saveOrUpdate(object);
session.getTransaction().commit();
}
}
和测试:
public void test(){
Product product = DBManager.load(Product.class,1);
Product productDup = DBManager.load(Product.class,1);
List<SellerIntegerMap> list = productDup.getStock();
list.get(0).setInteger(25);
DBManager.save(productDup);
}
数据在 SQL 表中更新,但不在与“productDup”相同的实体“product”中。我该如何解决这个问题?有什么办法可以在程序中解决它,而不是每次我们需要它们时加载数据?
解决方案
您需要在整个操作中完成一项事务。这样,Hibernate 将只保留该实体的单个托管实例。
推荐阅读
- python - 为什么“合并”后显示的数据与 pandas 和 jupyter notebook 中的实际数据框不同?
- git - 如何删除提交给 HEAD 的新文件
- javascript - 如何使用 JavaScript 和 Flask_socketio 将消息广播到特定 URL?
- stata - 如何在本地宏中存储带撇号的字符串
- c++ - 模板类可以有纯虚函数和虚运算符吗?
- docker - 在 CentOS 7 上将 Docker 从 19.03.2 降级到 18.09.9
- gradle - 如何从 Gradle 的子目录中复制?
- java - 无法为 org.gradle.api.Project 类型的根项目“[redacted]”获取未知属性“artifactory_contextUrl”
- java - 如何使用 docker compose 中的点设置属性名称?
- mysql - MySQL 服务器版本的错误手册,在第 1 行的“-1%”附近使用正确的语法 LIMIT 18446744073709551615'