仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4731|回复: 20
打印 上一主题 下一主题

[学习教程] 了解下JAVA的spring在MVC层办理JPA的缓迟加载成绩

[复制链接]
老尸 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:33:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
IDE是好。java中的IDE更是百花齐放,你用jbuilder能说jbuilder赶不上vs吗?用eclipse,net网页编程beans也很舒服啊。我就不明白“稍微差一些”那一些是从哪里差来的。
作为EJB3.0的一部分,JPA是一个好工具。其复杂的设置体例及壮大的默许设置撑持,使其能够轻松自在的存在于轻量与分量之间,假如如今您的JavaEE项目,不论是选择轻量级构架仍是分量级构架,假如耐久层不选择利用JPA,而是用一些ORM框架(如Hibernate、TopLink)的公用API,那末在未来的某一天必定会为这个选择而说出至尊宝那句“假设上天再给我一个时机…”的至理名言。
上面是一个复杂的Entity,是对一个CMS体系中,关于树状信息目次实体类的界说,包含了一些具体的映照的设置信息。@Entity
publicclassNewsDir...{
@Id
@GeneratedValue(strategy=GenerationType.TABLE)
privateLongid;//主键
@Column(unique=true,nullable=false,length=16)
privateStringsn;//目次编号
privateStringtitle;//目次称号
@OneToMany(mappedBy="parent",cascade=javax.persistence.CascadeType.REMOVE)
privateList<NewsDir>children=newjava.util.ArrayList<NewsDir>();//上级目次
@ManyToOne
privateNewsDirparent;//父级目次

}
固然,跟任何别的优异的手艺一样,JPA也不是完善的,在利用的过程当中不免城市出如许那样的成绩,这就必要我们程序员具有格物致知的伎俩,在使用中天真对付这些成绩。
这里例举一个缓迟加载的成绩,以下面的旧事目次Entity为例。关于parnet与children这个一对多的双向联系关系,为了进步体系效力,children默许利用的是缓迟加载的体例。在一些轻量级的构架中,因为离开了J2EE容器及事件撑持,常常会呈现Entity离开了PersitenceContext,酿成了detach或EntityManager封闭,招致一些我们料想中的一些功效没法一般运转。
最多见的就是在利用MVC框架的时分,在暗示层没法加载必要缓迟加载的数据。好比,在一个基于EasyJWeb的mvc使用中,action中的办法以下:
publicPagedoList(WebFormform,Modulemodule)...{
NewsDirQueryObjectndqo=newNewsDirQueryObject();
form.toPo(ndqo);
ndqo.setDel(true);
IPageListpageList=service.queryDirsByConditions(ndqo);
CommUtilForTeaec.saveIPageList2WebForm(pageList,form);
form.addResult("dirPath",this.getDirPath(form));
returnmodule.findPage("list");
}
在模板文件中有以下内容:
#foreach($infoin${dir.children})
目次称号:${info.title}
#end
关于营业逻辑层Bean的设置:
<aop:config>
<aop:pointcutid="CmsManage"
expression="execution(*com.easyjf.cms.service.*.*(..))"/>
<aop:advisoradvice-ref="cmsManageAdvice"
pointcut-ref="CmsManage"/>
<tx:adviceid="cmsManageAdvice"
transaction-manager="transactionManager">
<tx:attributes>
<tx:methodname="get*"propagation="SUPPORTS"
read-only="true"/>
<tx:methodname="query*"propagation="SUPPORTS"
read-only="true"/>
<tx:methodname="*"propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<beanid="cmsManageService"
class="com.easyjf.cms.service.impl.CmsManageServiceImpl">
<propertyname="newsDirDao"ref="newsDirDao"/>
</bean>
在这里,当mvc层实行到$!info.getChildren()办法的时分,将会用到缓迟加载,因为Spring的事件是设置在service层的,因而在实行service.queryDirsByConditions办法完成后就封闭了事件。因而运转程序就会呈现相似上面的毛病信息:
2007-03-2800:39:35,750ERROR[org.hibernate.LazyInitializationException]-failedtolazilyinitializeacollectionofrole:com.easyjf.cms.domain.NewsDir.children,nosessionorsessionwasclosed
org.hibernate.LazyInitializationException:failedtolazilyinitializeacollectionofrole:com.easyjf.cms.domain.NewsDir.children,nosessionorsessionwasclosed
atorg.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:358)
atorg.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:350)
atorg.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:97)
利用别的的mvc如struts、webwork以致springmvc城市有如许的成绩,成绩的中心是在事件启动及停止上,因为我们都习气于在service层而非mvc设置及利用事件,招致了如许的成绩。办理的举措实在很复杂,就是把事件的启动放到mvc层,
让mvc层的controller来开启事件,而让营业层的办法到场的事件中。好比,在EasyJWeb中,能够经由过程以下的设置来完成完成在action中开启事件:
在Spring设置文件中设置EasyJWeb的中心处置器,并把process办法增加到事件中,设置文件以下:
<aop:config>
<aop:pointcutid="easyjwebProcessor"
expression="execution(*com.easyjf.web.RequestProcessor.process(..))"/>
<aop:advisoradvice-ref="txEasyjwebProcessorAdvice"
pointcut-ref="easyjwebProcessor"/>
</aop:config>
<tx:adviceid="txEasyjwebProcessorAdvice"
transaction-manager="transactionManager">
<tx:attributes>
<tx:methodname="*"propagation="REQUIRED"read-only="true"/>
</tx:attributes>
</tx:advice>
<beanname="EasyJWeb-Processor"class="com.easyjf.web.core.DefaultRequestProcessor"/>
只必要如许复杂的设置,你会惊异的发明,一切缓迟加载及别的由PersitenceContext有效而引发的成绩均办理了。

而学习JAVA我觉得最应该避免的就是:只学习,不思考,只记忆,不实践!
因胸联盟 该用户已被删除
沙发
发表于 2015-1-25 11:44:19 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
谁可相欹 该用户已被删除
板凳
发表于 2015-2-1 22:25:52 | 只看该作者
是一种使用者不需花费很多时间学习的语言
愤怒的大鸟 该用户已被删除
地板
发表于 2015-2-2 15:06:24 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
飘灵儿 该用户已被删除
5#
发表于 2015-2-4 08:06:53 | 只看该作者
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
山那边是海 该用户已被删除
6#
发表于 2015-2-9 19:51:06 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
飘飘悠悠 该用户已被删除
7#
发表于 2015-2-26 20:50:28 | 只看该作者
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
小妖女 该用户已被删除
8#
发表于 2015-3-8 17:36:56 | 只看该作者
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
分手快乐 该用户已被删除
9#
发表于 2015-3-16 07:56:41 | 只看该作者
是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言
再现理想 该用户已被删除
10#
发表于 2015-3-22 17:06:50 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
蒙在股里 该用户已被删除
11#
发表于 2015-3-27 02:32:30 | 只看该作者
是一种使用者不需花费很多时间学习的语言
第二个灵魂 该用户已被删除
12#
发表于 2015-4-3 19:22:40 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
老尸 该用户已被删除
13#
 楼主| 发表于 2015-4-26 04:09:04 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
精灵巫婆 该用户已被删除
14#
发表于 2015-4-26 13:11:50 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
海妖 该用户已被删除
15#
发表于 2015-5-1 06:42:26 | 只看该作者
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
若天明 该用户已被删除
16#
发表于 2015-6-24 19:38:47 | 只看该作者
Java是一种计算机编程语言,拥有跨平台、面向对java
变相怪杰 该用户已被删除
17#
发表于 2015-6-27 03:32:00 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
admin 该用户已被删除
18#
发表于 2015-7-7 18:28:27 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
柔情似水 该用户已被删除
19#
发表于 2015-7-10 19:12:46 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
再见西城 该用户已被删除
20#
发表于 2015-7-15 05:31:14 | 只看该作者
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-4-20 21:44

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表