为了账号安全,请及时绑定邮箱和手机立即绑定

如何从 Hibernate 会话中删除不需要的实体?

如何从 Hibernate 会话中删除不需要的实体?

牧羊人nacy 2021-12-18 15:51:53
我试图Entity1通过查询映射到它的实体来获取。我正在使用CriteriaBuilder执行此操作,如下所示CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();CriteriaQuery<Entity1> createQuery = criteriaBuilder.createQuery(Entity1.class);Root<Entity1> root = createQuery.from(Entity1.class);Join<Entity1, MappedEntity2> mappedEntity2Join = root.join("mappedEntity2");createQuery.select(root);predicate = criteriaBuilder.and(predicate, criteriaBuilder.equal(root.get(COL_USER_ID), userId));// where clause to filter by query paramscreateQuery.where(predicate).distinct(true);createQuery.getRestriction();TypedQuery<Entity1> query = entityManager.createQuery(createQuery);但是在随机情况下,我发现查询是在“Entity2.entities1”上执行的,而没有在join中指定Entity2。我的猜测是 Entity2 已经在会话中可用,并且它是用 entity1 延迟初始化的。因此,Criteria 会为 Entity2 而不是 Entity1 生成查询。有什么方法可以限制在 Entity1 上查询的条件?或如何在执行此特定条件之前从会话中删除 Entity2。预期查询,select * from Entity1 obj1_ inner join mappedEntity1 mObj_ on obj1_.obj_id=mObj_.id where obj1_.id=?但查询生成为,select * from entities1_entities2 obj0_ inner join Entity1 obj1_ on obj0_.obj_id=obj1_.id where obj0_.entity2_id=?实体结构:public class Entity1 {    @ManyToOne    MappedEntity1 mappedEntity1;    @OneToMany    MappedEntity2 mappedEntity2;    @OneToMany    MappedEntity3 mappedEntity3;}和public class Entity2 {    @OneToMany    List<Entity1> entities1;    @OneToOne    MappedEntity2 mappedEntity2;}Entity1 和 Entity2 的参考表表名:entities1_entities2entity1_id INTEGER NOT NULL,entity2_id INTEGER NOT NULL,CONSTRAINT entities1_entities2_entity1_id_fkey FOREIGN KEY (entity1_id)REFERENCES entity1 (id),CONSTRAINT entities1_entities2_entity2_id_fkey FOREIGN KEY (entity2_id)    REFERENCES entity2 (id)
查看完整描述

3 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

我不是 100% 确定这一点。在执行搜索之前尝试关闭当前会话并打开另一个会话。


session.close();

session = sessionFactory.openSession();

这应该清除之前创建的(延迟初始化的)实体。


查看完整回答
反对 回复 2021-12-18
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

尝试加载要删除的实例并将其删除。


private boolean deleteById(Class<?> type, Serializable id) {

        Object persistentInstance = session.load(type, id);

        if (persistentInstance != null) {

            session.delete(persistentInstance);

            return true;

        }

        return false;

    }



boolean result = deleteById(Product.class, new Long(41));


查看完整回答
反对 回复 2021-12-18
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

首先,在查询新实体之前,您需要检查旧实体是否存在。您可以直接尝试将实体传递给 session.delete(),以删除该对象。如果在数据库中没有找到需要处理的记录,应该有一个异常。事实上,我们通常不会真正了解这种情况。我们总是删除一个现有的实体,我的意思是通常的逻辑是这样的;所以,如果已经完成,则无需这样做。你可以简单地这样做,


Entity1 ent = session.load(Entity1.class, '1234');

session.delete(ent);

或者你可以这样做,


Entity1 ent = new Entity1('1234'); // used constructor for brevity

session.delete(ent);

顺便说一句,你也可以使用这个版本的 session.delete(String query),


session.delete("from Entity1 e where e.id = '1234'"); // Just found it is deprecated


查看完整回答
反对 回复 2021-12-18
  • 3 回答
  • 0 关注
  • 188 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信