首页 > 解决方案 > 我们如何使用休眠更新实体的所有引用?

问题描述

有没有办法随时更新通过休眠加载到我们程序中的实体的所有引用?

例如,我在 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”中。我该如何解决这个问题?有什么办法可以在程序中解决它,而不是每次我们需要它们时加载数据?

标签: javahibernate

解决方案


您需要在整个操作中完成一项事务。这样,Hibernate 将只保留该实体的单个托管实例。


推荐阅读