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

我试图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 params

createQuery.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_entities2


entity1_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)


牧羊人nacy
浏览 189回答 3
3回答

富国沪深

我不是 100% 确定这一点。在执行搜索之前尝试关闭当前会话并打开另一个会话。session.close();session = sessionFactory.openSession();这应该清除之前创建的(延迟初始化的)实体。

慕桂英546537

尝试加载要删除的实例并将其删除。private boolean deleteById(Class<?> type, Serializable id) {&nbsp; &nbsp; &nbsp; &nbsp; Object persistentInstance = session.load(type, id);&nbsp; &nbsp; &nbsp; &nbsp; if (persistentInstance != null) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; session.delete(persistentInstance);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; }boolean result = deleteById(Product.class, new Long(41));

一只萌萌小番薯

首先,在查询新实体之前,您需要检查旧实体是否存在。您可以直接尝试将实体传递给 session.delete(),以删除该对象。如果在数据库中没有找到需要处理的记录,应该有一个异常。事实上,我们通常不会真正了解这种情况。我们总是删除一个现有的实体,我的意思是通常的逻辑是这样的;所以,如果已经完成,则无需这样做。你可以简单地这样做,Entity1 ent = session.load(Entity1.class, '1234');session.delete(ent);或者你可以这样做,Entity1 ent = new Entity1('1234'); // used constructor for brevitysession.delete(ent);顺便说一句,你也可以使用这个版本的 session.delete(String query),session.delete("from Entity1 e where e.id = '1234'"); // Just found it is deprecated
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java