如何使用Hibernate更新一个实体的所有引用?

11 浏览
0 Comments

如何使用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 List stock;
    ...
}

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 static  T 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);
        List list = productDup.getStock();
        list.get(0).setInteger(25);
        DBManager.save(productDup);
}

数据在SQL表中更新,但在“product”中没有更新,它是与“productDup”相同的实体。我该如何解决这个问题?有没有办法在程序中解决它,而不是每次需要数据时都加载它们?

0
0 Comments

在使用Hibernate时,我们可能会遇到一个问题:如何更新实体的所有引用?下面是关于这个问题的原因和解决方法的整理。

问题的原因是,当我们更新实体时,如果没有正确处理事务,Hibernate会保留多个管理的实例,这可能导致引用的不一致。

解决这个问题的方法是,我们需要在整个操作过程中使用一个事务。这样,Hibernate就会维护一个单一的管理实例来更新所有引用。

感谢上面的回答,这个方法确实有效。但是,还有一个问题:如何处理连接池限制?

连接池限制指的是连接池的最大连接数。这取决于您使用的数据源。如果您使用Spring Boot,可以参考这个类似的问题:stackoverflow.com/questions/25573034/…

以上就是关于如何使用Hibernate更新实体的所有引用的问题的原因和解决方法的整理。

0