如何使用Hibernate更新一个实体的所有引用?
如何使用Hibernate更新一个实体的所有引用?
是否有一种方法可以一次性更新Hibernate加载到我们程序中的实体的所有引用?
例如,我在类A中加载了id为“1”的产品,并在类B中更改了id为“1”的同一产品的新加载。但是在类A中的那个并没有改变。
我应该如何解决这个问题?
以下是代码的一部分:
Product类:
@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 Liststock; ... }
SellerIntegerMap类:
@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; }
DBManager类:
public class DBManager { public staticT load(Class 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); Listlist = productDup.getStock(); list.get(0).setInteger(25); DBManager.save(productDup); }
数据在SQL表中更新,但在“product”中没有更新,它是与“productDup”相同的实体。我该如何解决这个问题?有没有办法在程序中解决它,而不是每次需要数据时都加载它们?
在使用Hibernate时,我们可能会遇到一个问题:如何更新实体的所有引用?下面是关于这个问题的原因和解决方法的整理。
问题的原因是,当我们更新实体时,如果没有正确处理事务,Hibernate会保留多个管理的实例,这可能导致引用的不一致。
解决这个问题的方法是,我们需要在整个操作过程中使用一个事务。这样,Hibernate就会维护一个单一的管理实例来更新所有引用。
感谢上面的回答,这个方法确实有效。但是,还有一个问题:如何处理连接池限制?
连接池限制指的是连接池的最大连接数。这取决于您使用的数据源。如果您使用Spring Boot,可以参考这个类似的问题:stackoverflow.com/questions/25573034/…。
以上就是关于如何使用Hibernate更新实体的所有引用的问题的原因和解决方法的整理。