91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JPA findById方法和getOne方法有什么區別

發布時間:2021-08-14 16:31:30 來源:億速云 閱讀:688 作者:chen 欄目:開發技術

這篇文章主要講解了“JPA findById方法和getOne方法有什么區別”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JPA findById方法和getOne方法有什么區別”吧!

目錄
  • findById方法和getOne方法區別

    • getOne()方法是JpaRepository接口中定義的

    • 再看findById()方法

  • spring-data-jpa中findById()的使用

    findById方法和getOne方法區別

    Jpa基礎的CRUD方法繼承自接口CrudRepository<T, ID>,包含以下方法:

    <S extends T> S save(S entity);
    <S extends T> Iterable<S> saveAll(Iterable<S> entities);
    Optional<T> findById(ID id);
    boolean existsById(ID id);
    Iterable<T> findAll();
    Iterable<T> findAllById(Iterable<ID> ids);
    long count();
    void deleteById(ID id);
    void delete(T entity);
    void deleteAll(Iterable<? extends T> entities);
    void deleteAll();

    getOne()方法是JpaRepository接口中定義的

    源碼如下:

    /**
     * Returns a reference to the entity with the given identifier. Depending on how the JPA persistence provider is
     * implemented this is very likely to always return an instance and throw an
     * {@link javax.persistence.EntityNotFoundException} on first access. Some of them will reject invalid identifiers
     * immediately.
     *
     * @param id must not be {@literal null}.
     * @return a reference to the entity with the given identifier.
     * @see EntityManager#getReference(Class, Object) for details on when an exception is thrown.
     */
    T getOne(ID id);

    網上找的源碼:

    public T getOne(ID id) {
        Assert.notNull(id, "The given id must not be null!");
        return this.em.getReference(this.getDomainClass(), id);
    }

    由getOne方法的源碼可見,getOne方法會返回一個和給定id匹配的實體的引用,方法實際是調用getReference方法,也就是說加載策略是延遲加載,直到調用這個對象的時候才真正從數據庫中進行查詢(x_x)。

    再看findById()方法

    public Optional<T> findById(ID id) {
        Assert.notNull(id, "The given id must not be null!");
        Class<T> domainType = this.getDomainClass();
        if (this.metadata == null) {
            return Optional.ofNullable(this.em.find(domainType, id));
        } else {
            LockModeType type = this.metadata.getLockModeType();
            Map<String, Object> hints = this.getQueryHints().withFetchGraphs(this.em).asMap();
            return Optional.ofNullable(type == null ? this.em.find(domainType, id, hints) : this.em.find(domainType, id, type, hints));
        }
    }

    findById實際上調用的是find方法,采用立即加載方式,執行這條查詢語句的時候就會立刻從數據庫中進行查詢,不過findById方法返回的是一個Optional,需要對這個Optional調用.get()方法才能得到需要的實體。

    總結就是getOne方法是懶加載,直到調用它返回的實體時才會對數據庫進行查詢,findById是立即加載,主要調用方法就會去數據庫查詢。getOne方法直接返回一個實體,findById方法返回一個Optional,需要調用.get()方法獲取實體。

    spring-data-jpa中findById()的使用

    springboot 2.x 版本后,較之前的版本在此方法的使用上有差:

    如果找到匹配的id數據,則賦值給foo;否則則將括號中的對象賦值給foo。

    Foo foo = repository.findById(id)
                        .orElse(null);
    Foo foo = repository.findById(id)
                        .orElse(new Object());

    感謝各位的閱讀,以上就是“JPA findById方法和getOne方法有什么區別”的內容了,經過本文的學習后,相信大家對JPA findById方法和getOne方法有什么區別這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    jpa
    AI

    隆林| 东港市| 手游| 孟州市| 西畴县| 高雄县| 仁怀市| 龙门县| 庆元县| 郑州市| 高密市| 铜鼓县| 鸡西市| 聂荣县| 吉林市| 房产| 金塔县| 永泰县| 玉树县| 黑山县| 富锦市| 三亚市| 平顺县| 滕州市| 城口县| 防城港市| 赤水市| 宁南县| 金溪县| 通州市| 东阳市| 芮城县| 商都县| 台中市| 云南省| 石门县| 黄浦区| 论坛| 石渠县| 柳州市| 柳林县|