FetchType的区别是什么。LAZY和FetchType。Java持久性API中的EAGER ?


当前回答

来自Javadoc:

EAGER策略是持久性提供程序运行时的一个要求,即必须急切地获取数据。LAZY策略是对持久性提供程序运行时的一个提示,即在第一次访问数据时应该以惰性方式获取数据。

例如,渴望比懒惰更主动。Lazy只发生在第一次使用时(如果提供者接受了暗示),而对于急切的东西(可能)会被预取。

其他回答

JOIN很重要

轻松地看待它:

假设我们有一个叫User的类和另一个叫Address的类,假设每个用户都有一个或多个地址,意思是关系(一对多),如果执行:

FetchType。LAZY执行sql命令,就像没有join一样:

SELECT * FROM users 

FetchType。执行sql命令:

SELECT * FROM users u join address a on a.user_id = u.user_id

注意:以上查询只是为您澄清图像,但Hibernate框架实际执行的查询与上述查询类似。

哪种获取类型更好?

由于Eager抓取会自动加载所有关系,这是一个很大的性能消耗 除非被告知,否则惰性抓取不会加载任何关系,这将带来更好的性能 即时抓取使得编程更容易,因为需要的代码更少 如果整个系统没有经过适当的测试,延迟加载可能会导致错误(异常) 考虑到所有因素,您仍然应该更喜欢Lazy加载而不是Eager加载,因为它的性能更好

如果你正在使用Spring引导框架,那么就进入应用程序。属性文件并添加下面的命令以了解到底发生了什么。

logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE

这两种类型的抓取之间的主要区别是数据加载到内存中的时刻。 我附上了2张照片来帮助你理解这一点。

急于获取

延迟获取

Hibernate默认选择Lazy Fetch类型,除非显式地标记Eager Fetch类型。为了更准确和简洁,差异可以表述如下。

FetchType。LAZY =它不会加载关系,除非你通过getter方法调用它。

FetchType。EAGER =加载所有的关系。

这两种取回类型的优缺点。

延迟初始化通过避免不必要的计算和减少内存需求来提高性能。

主动初始化占用内存较多,处理速度较慢。

话虽如此,这两个初始化中的任何一个都可以使用,这取决于具体情况。

public enum FetchType extends java.lang.Enum Defines strategies for fetching data from the database. The EAGER strategy is a requirement on the persistence provider runtime that data must be eagerly fetched. The LAZY strategy is a hint to the persistence provider runtime that data should be fetched lazily when it is first accessed. The implementation is permitted to eagerly fetch data for which the LAZY strategy hint has been specified. Example: @Basic(fetch=LAZY) protected String getName() { return name; }

如果你在使用Hibernate,你可以在调用getStudents()方法时调用Hibernate.initialize():

Public class UniversityDaoImpl extends GenericDaoHibernate<University, Integer> implements UniversityDao {
    //...
    @Override
    public University get(final Integer id) {
        Query query = getQuery("from University u where idUniversity=:id").setParameter("id", id).setMaxResults(1).setFetchSize(1);
        University university = (University) query.uniqueResult();
        ***Hibernate.initialize(university.getStudents());***
        return university;
    }
    //...
}