Gau*_*rav 8 java persistence hibernate
我的印象是session.load()在缓存中加载代理对象,同时session.get()总是访问数据库,但看到JavaBrains 视频后我感到困惑.
根据这段视频,当我们调用下面的get方法时,它正在加载UserDetails内存中的代理对象.
user = (UserDetails) session.get(UserDetails.class, 1);
Run Code Online (Sandbox Code Playgroud)
结构UserDetails是
在评论部分,一个人评论说:
没有User类的代理,而是创建了集合的代理对象.
现在这里有两个问题.
1st:与session.load()和session.get()的获取策略和代理对象的创建有关,我已经在下面回答了这个问题.
第二种:在这种情况下,代理对象将为UserDetails或集合创建(仍有待回答).
谢谢
1.获取策略:在session.get或session.load(https://docs.jboss.org/hibernate/orm/4.2/manual/en-US/html/ch20.)的工作中获取策略没有任何效果. html#performance-fetching-lazy).
2. Session.get:它永远不会返回代理,根据hibernate docs:(https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Session.html#get ( java.lang). Class,java.io.Serializable))
返回给定实体类的持久实例和给定标识符,如果没有这样的持久实例,则返回null.(如果实例已与会话关联,则返回该实例.此方法永远不会返回未初始化的实例.)
means get方法首先检查缓存是否fully initialize object存在,如果是,则返回该对象,否则hits the database to get the object将其保存在缓存空间中后返回.
3. Session.load:根据hibernate文档:
假定实例存在,返回给定实体类的持久实例和给定标识符.当访问非标识符方法时,此方法可能会返回按需初始化的代理实例.
Means load方法首先检查缓存是否fully initialize object存在,如果是,则返回该对象,否则返回代理(代理是委托给另一个对象的类.最初,当它没有初始化时,它只包含主键.当你调用一个方法,就像Javadoc所说的那样,它通过"假设实例存在"来初始化,通过从数据库加载实际实体,以及该对象的委托到这个加载的实体).
注意:重要的是要注意该load方法never throw an exception.ObjectNotFoundException如果您尝试从代理对象中检索任何其他属性而不是主键,您将得到它.因为它将命中数据库以从那里加载对象,这是不存在的.
| 归档时间: |
|
| 查看次数: |
1306 次 |
| 最近记录: |