当前位置: 首页 > 知识库问答 >
问题:

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

文德曜
2023-03-14

是否有任何方法可以随时更新hibernate加载到程序中的实体的所有引用?

例如,我在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表中更新,而不是在“product”中更新,它是与“productDUP”相同的实体。我该如何解决问题呢?有没有办法在程序中解决,不是每次我们需要的时候都加载数据?

共有1个答案

符允晨
2023-03-14

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

 类似资料:
  • 问题内容: 我收到一个包含30个字段的JSON,而我的实体是根据此JSON构建的。问题是:不应更新两个字段(两个日期)。 如果使用,两个字段都会更新。 如何避免更新这两个字段? 也许使用criteria.Example? 没有我写大量的HQL,有什么方法可以做到这一点吗? 问题答案: 本文非常详细地解释了您的问题,但我也将在这里进行总结。 如果您永远不想更新这两个字段,则可以将它们标记为: 当你将

  • 问题内容: 我将SpringJPARepository与hibernate一起使用,并且对实体更新有一个问题。我通过传递单个实体来调用jparepository.save(entity),但在跟踪日志中,我也可以看到针对数据库中其他行发出的更新语句。在调用save之前,我有一个findAll并且某些实体的值正在更改。但是我只传递了一个要保存的实体,但是仍然保存了所有更新的实体。您能提供有关此信息吗

  • 我想这可能是一个新手问题,但我仍然想知道一些答案。 假设存在实体:医院和医生(多对多)。假设在我的controller类中,我必须获取所有现有的医生和医院,然后在特定的医院雇佣一名医生 它当然不起作用,因为--据我所知--我已经在控制器中获取了所有的医生和医院,然后在hireDoctor方法中,我们打开了传递常规Java对象的trasaction,这些对象不在会话中。 我知道,我可以用一个特殊的身

  • 我需要在另一个相关实体更新后对一个实体执行更新。 我有两个实体:和,关系为1:N。两者都有字段。状态取决于所有子状态字段。因此,如果更新了一个,我需要重新计算的新状态并持久化/更新它。 我实现了一个监听器: 监听器在中进行了注释,并且正在正确调用它。但是,在流程完成后,仍然保持旧状态,即使使用正确的新状态调用。

  • 我有3个字段的实体:id,lastname和PhoneNumber。我想创建一个方法,用于更新所有字段,或者只更新一个或两个字段。 我使用Hibernate和JPA存储库。当我尝试更新所有字段时,一切都运行良好,但例如,当我想只更新lastname而不更改phoneNumber时,我在output中输入了旧phoneNumber的null。 我正在寻找解决方案,我添加了@DynamicUpdate

  • 我在hibernate search 6中使用elasticsearch时遇到了问题。让我们假设我们有这样的设置: } } 当我第一次持久化EntityA(即被索引的实体)时,EntityB作为EntityA的子实体持久化在elasticsearch索引中。这是可以的。当我直接编辑EntityB并对其进行更改时,问题出现了,这种更改没有传播到elasticsearch索引。我错过了什么吗? 更新1