亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從 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 關注
  • 233 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號