什么是Java中的延迟加载?我不明白这个过程.任何人都可以帮我理解延迟加载的过程吗?
这可能是一个非常重要的问题,但是当编写跨越三个级别(或更多)的查询时,包含多个子实体的好方法是什么?
即我有4个表:Company,Employee,Employee_Car和Employee_Country
公司与员工有1:m的关系.
Employee与Employee_Car和Employee_Country都有1:m的关系.
如果我想编写一个返回所有4个表中数据的查询,我目前正在编写:
Company company = context.Companies
.Include("Employee.Employee_Car")
.Include("Employee.Employee_Country")
.FirstOrDefault(c => c.Id == companyID);
Run Code Online (Sandbox Code Playgroud)
必须有一个更优雅的方式!这是冗长的,并产生可怕的SQL
我在VS 2010中使用EF4
我得到以下异常:
Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
at sei.persistence.wf.entities.Element_$$_jvstc68_47.getNote(Element_$$_jvstc68_47.java)
at JSON_to_XML.createBpmnRepresantation(JSON_to_XML.java:139)
at JSON_to_XML.main(JSON_to_XML.java:84)
Run Code Online (Sandbox Code Playgroud)
当我尝试从main调用以下行时:
Model subProcessModel = getModelByModelGroup(1112);
System.out.println(subProcessModel.getElement().getNote());
Run Code Online (Sandbox Code Playgroud)
我getModelByModelGroup(int modelgroupid)首先实现了这个方法,如下所示:
public static Model getModelByModelGroup(int modelGroupId, boolean openTransaction) {
Session session = SessionFactoryHelper.getSessionFactory().getCurrentSession();
Transaction tx = null;
if (openTransaction) {
tx = session.getTransaction();
}
String responseMessage = "";
try {
if (openTransaction) {
tx.begin();
}
Query query = session.createQuery("from Model where modelGroup.id = :modelGroupId");
query.setParameter("modelGroupId", modelGroupId); …Run Code Online (Sandbox Code Playgroud) 在Hibernate期间Session,我正在加载一些对象,并且由于延迟加载,其中一些被加载为代理.一切都好,我不想把懒人装完.
但后来我需要通过RPC将一些对象(实际上是一个对象)发送到GWT客户端.碰巧这个具体对象是代理.所以我需要把它变成一个真实的对象.我在Hibernate中找不到类似"实现"的方法.
如何知道他们的类和ID,将一些对象从代理转换为实际?
目前,我看到的唯一解决方案是从Hibernate的缓存中驱逐该对象并重新加载它,但由于许多原因它真的很糟糕.
我有一个非常大的javascript文件,我只想在用户点击某个按钮时加载.我使用jQuery作为我的框架.是否有内置方法或插件可以帮助我这样做?
更多细节:我有一个"添加注释"按钮,应该加载TinyMCE javascript文件(我把所有TinyMCE的东西都煮成了一个JS文件),然后调用tinyMCE.init(...).
我不想在初始页面加载时加载它,因为不是每个人都会点击"添加评论".
我明白我可以这样做:
$("#addComment").click(function(e) { document.write("<script...") });
Run Code Online (Sandbox Code Playgroud)
但是有更好/封装的方式吗?
您使用什么样的替代策略来避免LazyLoadExceptions?
我确实理解在视图中打开会话有以下问题:
但是,如果您知道您的应用程序在单个虚拟机上运行,为什么不通过在视图策略中使用开放会话来减轻您的痛苦?
我在很多"现代"网站(例如脸书和谷歌图片搜索)中都注意到了这一点,只有当用户向下滚动页面足以将它们带入可见视口区域时,<img>才会加载折叠下方的图像(在查看源上,页面显示标签数量为X,但不会立即从服务器获取.这种技术叫做什么,它是如何工作的以及它有多少浏览器可以工作.是否有一个jQuery插件可以用最少的编码实现这种行为.
额外奖励:有人可以解释是否存在"onScrolledIntoView"或HTML元素的类似事件.如果没有,这些插件如何工作?
什么是懒惰加载?
[阅读几个答案后编辑]为什么人们经常使用这个术语?
假设您只使用ASP/ADO记录集并将其加载数据或ADO.NET数据源以用于gridview.
我想我应该问为什么人们使用"懒惰加载"一词,"其他"类型是什么?
我倾向于将Hibernate与Spring框架结合使用,并使用声明式事务划分功能(例如@Transactional).
众所周知,hibernate试图尽可能地非侵入性和透明性,但是这在使用关系时证明更具挑战性lazy-loaded.
我看到了许多具有不同透明度的设计方案.
fetchType=FetchType.EAGER)
Hibernate.initialize(proxyObj);
initialize,但是其他实现并不能保证提供任何等价物.Model对象本身(使用动态代理或@Transactional)
loadData()和loadDataWithDeps()
loadDataWithA(),....,loadDataWithX()byId()操作
findZzzById(zid)然后getYyyIds(zid)而不是z.getY()loadData(id, fetchProfile);
我错过了任何选择吗?
在尝试最小化lazy-loaded应用程序设计中关系的影响时,哪种方法是您首选的方法?
(哦,对不起WoT)
是)我有的:
@Entity
public class MyEntity {
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "myentiy_id")
private List<Address> addreses;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "myentiy_id")
private List<Person> persons;
//....
}
public void handle() {
Session session = createNewSession();
MyEntity entity = (MyEntity) session.get(MyEntity.class, entityId);
proceed(session); // FLUSH, COMMIT, CLOSE session!
Utils.objectToJson(entity); //TROUBLES, because it can't convert to json lazy collections
}
Run Code Online (Sandbox Code Playgroud)
真是个问题:
问题是我不能在会话关闭后拉懒惰集合.但我也不能在proceed方法中关闭会话.
什么解决方案(粗解决方案):
a)在会话关闭之前,强制hibernate拉取惰性集合
entity.getAddresses().size();
entity.getPersons().size();
Run Code Online (Sandbox Code Playgroud)
....
b)使用@Fetch(FetchMode.SUBSELECT) …
lazy-loading ×10
hibernate ×6
java ×6
javascript ×2
jpa ×2
jquery ×2
orm ×2
data-binding ×1
html ×1
linq ×1
proxy ×1
scroll ×1
session ×1
spring ×1
tinymce ×1