﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-just do it-随笔分类-Hibernate</title><link>http://www.blogjava.net/lzj520/category/23581.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 19 Mar 2008 08:51:45 GMT</lastBuildDate><pubDate>Wed, 19 Mar 2008 08:51:45 GMT</pubDate><ttl>60</ttl><item><title>spring中连接池的配置</title><link>http://www.blogjava.net/lzj520/archive/2008/03/19/187211.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Wed, 19 Mar 2008 04:09:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2008/03/19/187211.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/187211.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2008/03/19/187211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/187211.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/187211.html</trackback:ping><description><![CDATA[<strong>在默认通过myeclipse生成的配置里，spring使用的是apache的dbcp连接池</strong><br />
<br />
&lt;bean id="dataSource"<br />
&nbsp;&nbsp;class="org.apache.commons.dbcp.BasicDataSource"&gt;<br />
&nbsp;&nbsp;&lt;property name="driverClassName"<br />
&nbsp;&nbsp;&nbsp;value="com.mysql.jdbc.Driver"&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="url"<br />
&nbsp;&nbsp;&nbsp;value="jdbc:mysql://localhost:3306/mysql"&gt;<br />
&nbsp;&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="username" value="root"&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&lt;property name="password" value="root"&gt;&lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
<br />
<strong>如果改为C3P0则为：<br />
</strong><br />
&lt;bean id="propertyConfigurer"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="location"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;classpath:jdbc.properties&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
&lt;bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="driverClass" value="com.mysql.jdbc.Driver" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="jdbcUrl" value="${jdbc.url}" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="user" value="${jdbc.username}" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="password" value="${jdbc.password}" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="autoCommitOnClose" value="true"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="checkoutTimeout" value="${cpool.checkoutTimeout}"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="initialPoolSize" value="${cpool.minPoolSize}"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="minPoolSize" value="${cpool.minPoolSize}"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="maxPoolSize" value="${cpool.maxPoolSize}"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="maxIdleTime" value="${cpool.maxIdleTime}"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="acquireIncrement" value="${cpool.acquireIncrement}"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="maxIdleTimeExcessConnections" value="${cpool.maxIdleTimeExcessConnections}"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
jdbc.properties：<br />
<p># Database URL<br />
jdbc.url=jdbc:mysql://192.168.0.25"3306/db</p>
<p># Database login information<br />
jdbc.username=root<br />
jdbc.password=</p>
<p># Time to wait for an open connection before timing out<br />
# (in milliseconds)<br />
cpool.checkoutTimeout=5000</p>
<p># Connection pool size<br />
cpool.minPoolSize=5<br />
cpool.maxPoolSize=40</p>
<p># How long to keep unused connections around(in seconds)<br />
# Note: MySQL times out idle connections after 8 hours(28,800 seconds)<br />
# so ensure this value is below MySQL idle timeout<br />
cpool.maxIdleTime=25200</p>
<p># How long to hang on to excess unused connections after traffic spike<br />
# (in seconds)<br />
cpool.maxIdleTimeExcessConnections=1800</p>
<p># Acquiring new connections is slow, so eagerly retrieve extra connections<br />
# when current pool size is reached<br />
cpool.acquireIncrement=5<br />
<br />
或者将上面的3部分写成一个：<br />
&lt;bean id="c3p0DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="driverClass"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;${jdbc.driverClassName}&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="jdbcUrl"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;${jdbc.url}&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="user"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;${jdbc.username}&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="password"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;${jdbc.password}&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="initialPoolSize"&gt;&lt;value&gt;10&lt;/value&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="minPoolSize"&gt;&lt;value&gt;5&lt;/value&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="maxPoolSize"&gt;&lt;value&gt;30&lt;/value&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="acquireIncrement"&gt;&lt;value&gt;5&lt;/value&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="maxIdleTime"&gt;&lt;value&gt;10&lt;/value&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="maxStatements"&gt;&lt;value&gt;0&lt;/value&gt;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
<br />
<strong>如果使用的是受管理的J2EE服务器，则在spring中配置为JNDI连接：<br />
</strong>&lt;bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"&gt;<br />
&lt;property name="jndiName"&gt;<br />
&lt;value&gt;java:comp/env/jndi/xxx&lt;/value&gt;<br />
&lt;/property&gt;<br />
&lt;/bean&gt;<br />
<br />
<strong>如果在应用里有独自使用hibernate，则在spring中配置hibernate连接池，使用C3P0如下：<br />
</strong>&lt;bean&nbsp;&nbsp; id="DataSource"&nbsp;&nbsp; <br />
&nbsp; class="org.apache.commons.dbcp.BasicDataSource"&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;property&nbsp;&nbsp; name="driverClassName"&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;value&gt;oracle.jdbc.driver.OracleDriver&lt;/value&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;/property&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;property&nbsp;&nbsp; name="url"&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;value&gt;jdbc:oracle:thin:@172.16.20.241:1521:dbsvr&lt;/value&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;/property&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;property&nbsp;&nbsp; name="username"&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;value&gt;hl3000&lt;/value&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;/property&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;property&nbsp;&nbsp; name="password"&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;value&gt;hldw3101&lt;/value&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;/property&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;/bean&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;bean&nbsp;&nbsp; id="SessionFactory"&nbsp;&nbsp; <br />
&nbsp; class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;property&nbsp;&nbsp; name="dataSource"&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;ref&nbsp;&nbsp; bean="DataSource"&nbsp;&nbsp; /&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;/property&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;property&nbsp;&nbsp; name="hibernateProperties"&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;props&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;prop&nbsp;&nbsp; key="hibernate.dialect"&gt;org.hibernate.dialect.OracleDialect&lt;/prop&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;prop&nbsp;&nbsp; key="hibernate.show_sql"&gt;true&lt;/prop&gt;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp; &lt;!--&nbsp;&nbsp; C3P0连接池配置&nbsp;&nbsp; --&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;prop&nbsp;&nbsp; key="hibernate.connection.provider_class"&gt;org.hibernate.connection.C3P0ConnectionProvider&lt;/prop&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;prop&nbsp;&nbsp; key="hibernate.c3p0.max_size"&gt;20&lt;/prop&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;prop&nbsp;&nbsp; key="hibernate.c3p0.min_size"&gt;5&lt;/prop&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;prop&nbsp;&nbsp; key="hibernate.c3p0.timeout"&gt;120&lt;/prop&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;prop&nbsp;&nbsp; key="hibernate.c3p0.max_statements"&gt;100&lt;/prop&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;prop&nbsp;&nbsp; key="hibernate.c3p0.idle_test_period"&gt;120&lt;/prop&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;prop&nbsp;&nbsp; key="hibernate.c3p0.acquire_increment"&gt;2&lt;/prop&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;prop&nbsp;&nbsp; key="myeclipse.connection.profile"&gt;hl3000&lt;/prop&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;/props&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;/property&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;property&nbsp;&nbsp; name="mappingResources"&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;list&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;value&gt;com/hl3000/DBLogic/POJO/PermUserAccount.hbm.xml&lt;/value&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;/list&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;/property&gt;&nbsp;&nbsp; <br />
&nbsp; &lt;/bean&gt;&nbsp; <br />
<br />
<strong>spring中配置独立使用hibernate时使用jndi的配置：<br />
</strong><br />
hibernate.dialect = net.sf.hibernate.dialect.MySQLDialect<br />
hibernate.connection.datasource=java:comp/env/jdbc/SAMPLEDB<br />
hibernate.show_sql=true<br />
<br />
<strong>如果是使用不受管理的Servlet容器如Tomcat，也可以使用jndi的方式配置，需要在tomcat中配置数据源，在server.xml中增改大致如下：<br />
</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;Resource name="jdbc/testDb" auth="Container"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="javax.sql.DataSource"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ResourceParams name="jdbc/testDB"&gt;\\数据源的名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;&lt;name&gt;username&lt;/name&gt;&lt;value&gt;root&lt;/value&gt;&lt;/parameter&gt;数据库的名称<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;&lt;name&gt;password&lt;/name&gt;&lt;value&gt;password&lt;/value&gt;&lt;/parameter&gt;数据库密码<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;&lt;name&gt;driverClassName&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;org.gjt.mm.mysql.Driver&lt;/value&gt;&lt;/parameter&gt;\\要加载的驱动<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;parameter&gt;&lt;name&gt;url&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;jdbc:mysql://172.20.0.73/rk?&lt;/value&gt;&lt;/parameter&gt;\\要连接的URL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ResourceParams&gt;<br />
<br />
</p>
<img src ="http://www.blogjava.net/lzj520/aggbug/187211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2008-03-19 12:09 <a href="http://www.blogjava.net/lzj520/archive/2008/03/19/187211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ssh上传并显示图片</title><link>http://www.blogjava.net/lzj520/archive/2008/01/17/176020.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Thu, 17 Jan 2008 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2008/01/17/176020.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/176020.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2008/01/17/176020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/176020.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/176020.html</trackback:ping><description><![CDATA[使用的是将图片保存到服务器，并记录路径名的方式，代码如下：<br />
<br />
<strong>struts部分：<br />
</strong><br />
&nbsp;&lt;form-bean name="upfileForm" type="org.apache.struts.validator.DynaValidatorForm"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="filename" type="java.lang.String" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;form-property name="filedata" type="org.apache.struts.upload.FormFile" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/form-bean&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;action<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attribute="upfileForm"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; input="/upload/uploadfile.jsp"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="upfileForm"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path="/upfile"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scope="request"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validate="true"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="com.yourcompany.struts.action.UpfileAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="ok" path="/upload/ok.jsp" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;action path="/displayimg" type="com.yourcompany.struts.action.DisplayimgAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;forward name="ok" path="/upload/displayimg.jsp" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/action&gt;<br />
<br />
<p>&nbsp;</p>
<p>public class UpfileAction extends Action {<br />
&nbsp;/*<br />
&nbsp; * Generated Methods<br />
&nbsp; */</p>
<p>&nbsp;/** <br />
&nbsp; * Method execute<br />
&nbsp; * @param mapping<br />
&nbsp; * @param form<br />
&nbsp; * @param request<br />
&nbsp; * @param response<br />
&nbsp; * @return ActionForward<br />
&nbsp; */<br />
&nbsp;public ActionForward execute(ActionMapping mapping, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;HttpServletRequest request, HttpServletResponse response) {<br />
&nbsp;&nbsp;DynaActionForm upfileForm = (DynaActionForm) form;// TODO Auto-generated method stub&nbsp;&nbsp; <br />
&nbsp;&nbsp; Image image = new Image();</p>
<p>&nbsp;&nbsp; String strimgname = upfileForm.getString("filename");<br />
&nbsp;&nbsp; image.setImgname(strimgname);<br />
&nbsp;&nbsp; imageDAO.save(image);&nbsp;<br />
&nbsp;&nbsp;FormFile filedata = (FormFile)upfileForm.get("filedata");<br />
&nbsp;&nbsp; ServletContext servletContext = this.getServlet().getServletContext();<br />
&nbsp;&nbsp; String filePath = servletContext.getRealPath("/");<br />
&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp; InputStream stream = filedata.getInputStream();<br />
&nbsp;&nbsp;&nbsp; OutputStream bos = new FileOutputStream(filePath + "/image/" + filedata.getFileName());<br />
&nbsp;&nbsp;&nbsp;&nbsp; int bytesRead = 0; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] buffer = new byte[8192]; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( (bytesRead = stream.read(buffer, 0, 8192)) != -1) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bos.write(buffer, 0, bytesRead); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bos.close(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stream.close();<br />
&nbsp;&nbsp; }catch (FileNotFoundException e) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) { <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace(); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mapping.findForward("ok");<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;private ImageDAO imageDAO;<br />
&nbsp;public void setImageDAO(ImageDAO dao){<br />
&nbsp;&nbsp;this.imageDAO = dao;&nbsp;&nbsp;<br />
&nbsp;}<br />
&nbsp;<br />
}</p>
<p><br />
&nbsp;</p>
<p>public class DisplayimgAction extends Action {<br />
&nbsp;/*<br />
&nbsp; * Generated Methods<br />
&nbsp; */</p>
<p>&nbsp;/** <br />
&nbsp; * Method execute<br />
&nbsp; * @param mapping<br />
&nbsp; * @param form<br />
&nbsp; * @param request<br />
&nbsp; * @param response<br />
&nbsp; * @return ActionForward<br />
&nbsp; */<br />
&nbsp;public ActionForward execute(ActionMapping mapping, ActionForm form,<br />
&nbsp;&nbsp;&nbsp;HttpServletRequest request, HttpServletResponse response) {<br />
&nbsp;&nbsp;// TODO Auto-generated method stub<br />
&nbsp;&nbsp;List results = imageDAO.findAll();<br />
&nbsp;&nbsp;if(results!=null){<br />
&nbsp;&nbsp;&nbsp;HttpSession session=request.getSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute("results",results);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mapping.findForward("ok");<br />
&nbsp;&nbsp;}return mapping.findForward("fail");<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;private ImageDAO imageDAO;<br />
&nbsp;public void setImageDAO(ImageDAO dao){<br />
&nbsp;&nbsp;this.imageDAO = dao;&nbsp;&nbsp;<br />
&nbsp;}<br />
&nbsp;<br />
}</p>
<p><br />
ImageDAO.java<br />
<br />
&nbsp;public void save(Image transientInstance) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; Session session =this.getSession(); <br />
&nbsp;&nbsp;&nbsp;&nbsp; Transaction tx = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp; tx = session.beginTransaction();<br />
&nbsp;&nbsp;&nbsp;&nbsp; session.save(transientInstance);<br />
&nbsp;&nbsp;&nbsp;&nbsp; tx.commit();<br />
&nbsp;&nbsp;&nbsp;&nbsp; session.evict(transientInstance);<br />
&nbsp;}<br />
<br />
&nbsp;public List findAll() {<br />
&nbsp;&nbsp;Session session =this.getSession(); <br />
&nbsp;&nbsp;Query query = session.createQuery("from Image");<br />
&nbsp;&nbsp;return query.list();<br />
&nbsp;}<br />
<br />
displayimg.jsp<br />
<br />
&lt;logic:iterate id="element" name="results"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp; &lt;td width="100"&gt;&lt;bean:write name="element" property="id"/&gt; &lt;/td&gt;<br />
&nbsp;&nbsp; &lt;td width="100"&gt;&lt;img&nbsp; src="image/&lt;bean:write&nbsp; name='element' property='imgname'/&gt;"/&gt;&lt;/td&gt;<br />
&nbsp;&nbsp; &lt;/tr&gt;<br />
&lt;/logic:iterate&gt;<br />
<br />
uploadfile.jsp<br />
<br />
&lt;html:form action="/upfile" enctype = "multipart/form-data"&gt;<br />
&nbsp;&nbsp;&nbsp;filename : &lt;html:text&nbsp; property="filename"/&gt;&lt;html:errors property="filename"/&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;filedata : &lt;html:file property="filedata"/&gt;&lt;html:errors property="filedata"/&gt;&lt;br/&gt;<br />
&nbsp;&nbsp;&nbsp;&lt;html:submit/&gt;&lt;html:cancel/&gt;<br />
&nbsp;&nbsp;&lt;/html:form&gt;<br />
<br />
</p>
<p>&lt;!-- u-f8 filter --&gt;<br />
&nbsp; &lt;filter&gt;<br />
&nbsp; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br />
&nbsp; &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt;<br />
&nbsp; &lt;init-param&gt;<br />
&nbsp;&nbsp; &lt;param-name&gt;encoding&lt;/param-name&gt;<br />
&nbsp;&nbsp; &lt;param-value&gt;UTF-8&lt;/param-value&gt;<br />
&nbsp; &lt;/init-param&gt;<br />
&nbsp;&lt;/filter&gt;</p>
<p>&nbsp;&lt;filter-mapping&gt;<br />
&nbsp; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br />
&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br />
&nbsp;&lt;/filter-mapping&gt;</p>
<p>&nbsp;&lt;filter-mapping&gt;<br />
&nbsp; &lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br />
&nbsp; &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />
&nbsp;&lt;/filter-mapping&gt;</p>
<img src ="http://www.blogjava.net/lzj520/aggbug/176020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2008-01-17 17:44 <a href="http://www.blogjava.net/lzj520/archive/2008/01/17/176020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己写了一个ssh分页</title><link>http://www.blogjava.net/lzj520/archive/2008/01/10/174373.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Thu, 10 Jan 2008 10:55:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2008/01/10/174373.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/174373.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2008/01/10/174373.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/174373.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/174373.html</trackback:ping><description><![CDATA[关于分页经验不是很多，让我来做分页，我习惯用这样的一种方法，以前用ASP和PHP的时候也是这样来处理的。也没怎么认真去检查是否科学，不过先做出来再说，交出一个不怎么好的作品总比交不出作品好。不好的话还可以去完善和优化嘛。<br />
<br />
首先，先创建一个显示每一页（有若干条数据）的方法（如下面的hfindAll方法），决定好每一页接收一个页码参数，然后显示该页码里的数据。比如有100条数据，那么分10页，那第几页显示第几条至第几条数据。然后再创建一个方法是用于在view层显示页数（如下面的amountPage方法），最后是在view层上为每一页数的数字加上超链接。 <br />
<br />
以下是主要代码：<br />
public class LoginDAO extends HibernateDaoSupport {<br />
private int PageSize =5;<br />
/*设置每页的数据条数*/<br />
<br />
&nbsp;public Integer amountPage(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; Session session =this.getSession(); <br />
&nbsp;&nbsp;Query query = session.createQuery("from Login");<br />
&nbsp;&nbsp;query.setCacheable(true);<br />
&nbsp;&nbsp;int a = query.list().size()%PageSize;<br />
/*总记录数/每页数据数,判断是否能整除*/<br />
&nbsp;&nbsp;Integer&nbsp;amount;<br />
&nbsp;&nbsp;if(a!=0){<br />
&nbsp;&nbsp;&nbsp;amount = query.list().size()/PageSize+1;<br />
/*如果整除有余数，则页数加1*/<br />
&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;amount = query.list().size()/PageSize;<br />
/*如果整除没余数，则直接总记录数/每页数据数*/<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return amount;<br />
&nbsp;}<br />
<br />
&nbsp;public List hfindAll(String pagenum) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; Session session =this.getSession(); <br />
&nbsp;&nbsp;Query query = session.createQuery("from Login");<br />
&nbsp;&nbsp;if (pagenum == null){<br />
/*如果pagenum是空，则数据从第一条开始*/<br />
&nbsp;&nbsp;query.setFirstResult(0);<br />
/*设置查询开始的第几条数据，这里是从第1条开始*/<br />
&nbsp;&nbsp;query.setMaxResults(PageSize);<br />
/*设置查询数据条数，这里是5条*/<br />
&nbsp;&nbsp;query.setCacheable(true);<br />
/*设置一级缓存*/<br />
&nbsp;&nbsp;}else{<br />
&nbsp;&nbsp;&nbsp;Integer p = (Integer.valueOf(pagenum)-1) * PageSize;<br />
&nbsp;&nbsp;&nbsp;query.setFirstResult(p);<br />
&nbsp;&nbsp;&nbsp;query.setMaxResults(PageSize);<br />
&nbsp;&nbsp;&nbsp;query.setCacheable(true);<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;return query.list();<br />
&nbsp;}<br />
}<br />
<br />
然后需要解决的是一些数据传递，类型转换和在view层显示的问题，主要代码如下：<br />
<br />
在ACTION里：<br />
String strpagenum = request.getParameter("pagenum");<br />
&nbsp;&nbsp;List results= loginManage.hfind(strpagenum);<br />
&nbsp;&nbsp;Integer amountPage = loginManage.amountPage();<br />
&nbsp;&nbsp;&nbsp; if(results!=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpSession session=request.getSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute("results",results);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.setAttribute("amountPage",amountPage);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mapping.findForward("ok");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return mapping.findForward("fail");<br />
<br />
在view视图里：<br />
显示每页数据的代码：<br />
<p>&nbsp;&lt;logic:iterate id="element" name="results"&gt;&nbsp;&nbsp;&nbsp; &lt;tr&gt;<br />
&nbsp;&nbsp; &lt;td width="100"&gt;&lt;input type="checkbox" name="select" value="&lt;bean:write name="element" property="id"/&gt;"&gt;&lt;bean:write name="element" property="id"/&gt;&lt;/td&gt;<br />
&nbsp;&nbsp; &lt;td width="100"&gt;&lt;bean:write name="element" property="name"/&gt; &lt;/td&gt;<br />
&nbsp;&nbsp; &lt;td width="100"&gt;&lt;bean:write name="element" property="password"/&gt;&lt;/td&gt;<br />
&nbsp;&nbsp; &lt;/tr&gt;&lt;/logic:iterate&gt;<br />
<br />
显示页码的代码：<br />
&lt;%<br />
&nbsp;&nbsp; int i;<br />
&nbsp; int a=Integer.parseInt(session.getAttribute("amountPage").toString());<br />
&nbsp;&nbsp; for (i=1;i&lt;=a;i++){<br />
&nbsp;&nbsp; out.println("&lt;tr&gt;");&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("&lt;td&gt;&lt;a href='display.do?pagenum="+ i +"'&gt;"+ i +"&lt;/a&gt;&lt;/td&gt;");&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.println("&lt;/tr&gt;");&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; %&gt;</p>
<br />
 <img src ="http://www.blogjava.net/lzj520/aggbug/174373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2008-01-10 18:55 <a href="http://www.blogjava.net/lzj520/archive/2008/01/10/174373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring+hibernate里session的管理</title><link>http://www.blogjava.net/lzj520/archive/2008/01/10/174392.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Thu, 10 Jan 2008 10:41:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2008/01/10/174392.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/174392.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2008/01/10/174392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/174392.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/174392.html</trackback:ping><description><![CDATA[在spring+hibernate的时候，控制台提示&#8220;unclosed connection,forgot to call close() on your session?&#8221;<br />
或者是[org.hibernate.jdbc.ConnectionManager] - &lt;finalizing with closed connection&gt;<br />
那是因为有可能是你自己手动创建了session，比如：<br />
<p>private static final SessionFactory sessionFactory;</p>
<p>&nbsp;&nbsp;&nbsp; static {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create the SessionFactory from hibernate.cfg.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessionFactory = new Configuration().configure().buildSessionFactory();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Throwable ex) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Make sure you log the exception, as it might be swallowed<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Initial SessionFactory creation failed." + ex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new ExceptionInInitializerError(ex);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
然后调用：<br />
</p>
<p>Session session = sessionFactory.openSession();<br />
Query query = session.createQuery("from Login");</p>
<p>类似这样的单独使用hibernate时的用法，是需要手工去关闭session的。没有关闭的话就会收到那样的警告。<br />
<span style="color: #000000"><br />
所以最好是使用spring管理的session，和OpenSessionInViewFilter，比如：<br />
Session session =this.getSession();<br />
然后在web.xml里加入<br />
&nbsp; &lt;filter&gt;<br />
&nbsp; &lt;filter-name&gt;OpenSessionInViewFilter&lt;/filter-name&gt;<br />
&nbsp; &lt;filter-class&gt;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&lt;/filter-class&gt;<br />
&nbsp; &lt;/filter&gt;<br />
&nbsp; &lt;filter-mapping&gt; <br />
&lt;filter-name&gt;OpenSessionInViewFilter&lt;/filter-name&gt; <br />
&lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />
&lt;/filter-mapping&gt; <br />
<br />
其中在spring里注册的sessionfactory必须是id="sessionFactory"，如果是id="SessionFactory"或者其他，会提示sessionFactory没有注册的错误，因为OpenSessionInViewFilter里注册的名必须为sessionFactory。<br />
</p>
</span>
 <img src ="http://www.blogjava.net/lzj520/aggbug/174392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2008-01-10 18:41 <a href="http://www.blogjava.net/lzj520/archive/2008/01/10/174392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>070827 hibernate关联、联级操作、对象生命周期、检索策略</title><link>http://www.blogjava.net/lzj520/archive/2007/08/27/139776.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Mon, 27 Aug 2007 02:15:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2007/08/27/139776.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/139776.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2007/08/27/139776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/139776.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/139776.html</trackback:ping><description><![CDATA[<p>在mysql里建立2个表<br>CREATE TABLE `customers` (<br>&nbsp; `id` int(11) NOT NULL auto_increment,<br>&nbsp; `name` char(20) character set latin1 default NULL,<br>&nbsp; PRIMARY KEY&nbsp; (`id`)<br>) ENGINE=InnoDB DEFAULT CHARSET=utf8;<br><br>CREATE TABLE `orders` (<br>&nbsp; `id` int(11) NOT NULL auto_increment,<br>&nbsp; `customer_id` int(50) NOT NULL default '0',<br>&nbsp; `order_number` int(50) default NULL,<br>&nbsp; PRIMARY KEY&nbsp; (`id`),<br>&nbsp; KEY `fk_customer_id` (`customer_id`),<br>&nbsp; CONSTRAINT `fk_customer_id` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)<br>) ENGINE=InnoDB DEFAULT CHARSET=utf8;<br><br>然后自动生成持久化类，在customers.hbm.xml一方设置与orders的外键customer_id的一对多关联，其中联级操作为save-update，inverse="true"为表示hibernate不由customers对象的状态变化来更新数据库，仅按照Orders对象状态变化来更新数据库。由此来优化hibernate的性能。<br>&nbsp;&lt;set name="orderses" inverse="true" cascade="save-update"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="customer_id" unique="true" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/key&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;one-to-many class="com.yourcompany.model.Orders" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/set&gt;<br><br>在orders.hbm.xml设置多对一关联，其中业务逻辑决定了order是由customer来下决定的，所以必须not-null="true" ，联级操作根据实际情况而定，本例子的逻辑关系里面，应该不需要在many-to-one一方设置save-update联级操作，因为增加orders并不需要增加customer。在目前的情况里如果设置了save-update，增加orders记录的时候hibernate就会把原来已存在的customers记录设置为null。这是不对的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;many-to-one name="customers" class="com.yourcompany.model.Customers" fetch="select" &gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="customer_id" not-null="true" unique="true" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/many-to-one&gt;<br><br>在AddCustomerAction里保存一个customers，之后可以看到当保存一个customers的同时，orders也同时保存了该customers的id。<br>&nbsp;&nbsp;String strname = addCustomerForm.getString("name");<br>&nbsp;&nbsp;Customers customers = new&nbsp; Customers();<br>&nbsp;&nbsp;customers.setName(strname);<br>&nbsp;&nbsp;Orders orders=new Orders();<br>&nbsp;&nbsp;orders.setCustomers(customers);<br>&nbsp;&nbsp;customers.getOrderses().add(orders);<br>&nbsp;&nbsp;customersDAO.save(customers);<br><br>其中<br>&nbsp;&nbsp;orders.setCustomers(customers);<br>&nbsp;&nbsp;customers.getOrderses().add(orders);<br>在建立两个对象的双向关联时，应该同时修改关联两端的对象的相应属性，这样可提高业务逻辑的独立性。<br>比如：解除双向关联时：<br>&nbsp;&nbsp;customers.getOrderses().remove(orders);<br>&nbsp;&nbsp;orders.setCustomers(null);<br><br>在AddOrdersAction里，由表单传入customers的ID值和新增加的order_number值。ordersDAO.attachDirty(orders);为Myeclipse里生成的DAO，其调用的是HibernateTemplate的getHibernateTemplate().saveOrUpdate(instance);方法。<br>&nbsp;&nbsp;Integer strcustomers= Integer.valueOf(addOrdersForm.getString("customers"));<br>&nbsp;&nbsp;Integer strorder_number= Integer.valueOf(addOrdersForm.getString("order_number"));<br>&nbsp;&nbsp;Orders orders = new&nbsp; Orders();&nbsp;<br>&nbsp;&nbsp;Customers customers = new&nbsp; Customers();<br>&nbsp;&nbsp;customers.setId(strcustomers);<br>&nbsp;&nbsp;orders.setCustomers(customers);<br>&nbsp;&nbsp;orders.setOrderNumber(strorder_number);<br>&nbsp;&nbsp;ordersDAO.attachDirty(orders);<br><br>在这里的持久化对象的生命周期里，当Customers customers = new&nbsp; Customers();时,Customers还属于临时状态,而到了sessionv.save(customers);的时候Customers由临时状态转变为持久化状态。临时状态时不处于Session缓存中，转化为持久化状态后Customers就加入到了Session缓存中,在此Customers customers 2=（Customers）session.load(Customer.class,id);、Customers customers 3=（Customers）session.load(Customer.class,id);、均是在持久化状态。而直到session.close();就表明Customers退出了Session缓存，由持久化状态转变为游离状态。System.out.println（customers 3.getname()）;也是处于游离状态。到最后c2=null；c3=null；Customers生命周期结束。<br><br>Session有三种检索方法：load()、get()、find()，检索策略有类级别的：立即检索、延迟检索，关联级别的立即检索、延迟检索、迫切左外连接检索。在类级别中应该有线考虑使用立即检索。不管hbm文件里lazy属性是true还是false，Session的get()、find()方法总是使用立即检索策略。<br><br>在一对多关联级别中，对于&lt;set&gt;元素不能随意使用立即检索策略，尽量使用延迟检索策略。应用程序如果新闻访问游离状态的代理类实例，必须保证它在持久化状态时已经被初始化，不然会抛出异常<br><br>对于多对一或一对一关联，应该优先考虑使用外连接检索策略，因为它比立即检索策略使用的select语句数目少。在默认情况下&lt;many-to-one&gt;元素的outer-join属性为auto，&lt;class&gt;元素的lazy属性为false，因此默认使用迫切外连接检索策略。迫切外连接检索策略受数据库表的大小和连接影响，如果select语句中的外连接表的数目太多，会影响检索性能，可以通过Hibernate配置文件中的hibernate.max_fetch_depth来达到优化。hibernate.max_fetch_depth取决数据库连接性能及表大小。<br></p>
 <img src ="http://www.blogjava.net/lzj520/aggbug/139776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2007-08-27 10:15 <a href="http://www.blogjava.net/lzj520/archive/2007/08/27/139776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>070621 SSH一些出错小结（不断更新）</title><link>http://www.blogjava.net/lzj520/archive/2007/06/21/125513.html</link><dc:creator>lzj520</dc:creator><author>lzj520</author><pubDate>Thu, 21 Jun 2007 04:01:00 GMT</pubDate><guid>http://www.blogjava.net/lzj520/archive/2007/06/21/125513.html</guid><wfw:comment>http://www.blogjava.net/lzj520/comments/125513.html</wfw:comment><comments>http://www.blogjava.net/lzj520/archive/2007/06/21/125513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lzj520/comments/commentRss/125513.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lzj520/services/trackbacks/125513.html</trackback:ping><description><![CDATA[<p>Spring Hibernate在AOP方面的配置冲突<br>Spring2.0 Hibernate3.1.x/Hibernate3.2<br><br>在使用Spring的AOP编程时，会用到这几个lib：<br>asm-2.2.2.jar<br>asm-commons-2.2.2.jar<br>asm-util-2.2.2.jar<br><br>Hibernate如果使用lib：<br>asm.jar<br>asm-attrs.jar<br><br>其中asm-2.2.2.jar与asm.jar存在类上的冲突！！！<br>使用其中之一或两者都使用，可能会出现如下错误：<br>java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor<br>java.lang.NoClassDefFoundError: org/objectweb/asm/commons/EmptyVisitor<br>java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit。。。。。。<br><br>解决办法是：<br>1）.去掉类路径上的关于Hibernate的3个lib<br>asm.jar<br>asm-attrs.jar<br>cglib-2.1.3.jar<br>2）.加入Spring中的以下4个lib<br>asm-2.2.2.jar<br>asm-commons-2.2.2.jar<br>asm-util-2.2.2.jar<br>cglib-nodep-2.1_3.jar<br><br>如果再不行，都试试删删看。<br><br><br>java.lang.SecurityException: class "javax.xml.bind.JAXBContext"'s signer information does not match signer information of other classes in the same package<br>这个错误是因为载入的包里面有两个相同路径的类，就是在一个包里面有两个同名的类<br>有可能是将相同的包载入两次或者把包解开后，先将jar文件载入了，后又将解开的类载入了<br><br><br>Error configuring application listener of class org.springframework.web.context.ContextLoaderListener<br>试试自己去下一个spring的包，把包里的spring.jar加到项目里去。eclipse生成的时候可能会有些包没有放进去。<br><br><br>Error creating bean with name 'datasource' defined in file<br>Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool<br>试试将commons-dbcp.jar，commons-pool.jar和commons- collections.jar加入CLASSPATH中<br><br><br>hibernate 3.1 中的hibernateTemplate ，class应该为org.springframework.orm.hibernate3.HibernateTemplate，而非org.springframework.orm.hibernate.HibernateTemplate，因为某些原因我现在还用3.1，早前在玩springside的时候感觉hibernate 3.2 的Hibernate Annotations方便多了。<br><br>找不到action或报错的另一少有原因，一些版本hibernate版本会有些冲突方面的问题，可换一版本的hibernate试试，个人感觉hibernate的版本对应用会比较敏感 <br><br><br><font color=#008080><span style="COLOR: #000000">org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in resource [/WEB-INF/dataAccessContext-hibernate.xml] of ServletContext: Instantiation of bean failed; nested exception is java.lang.NoClassDefFoundError: javax/transaction/TransactionManager<br>java.lang.NoClassDefFoundError: javax/transaction/TransactionManager</span><br><br></font>原因：缺少jta.jar&nbsp;或者是找不到hbm.xml文件导致sessionfactory出错,检查hbm文件路径是否正确,文件是否存在<br>&lt;property name="mappingResources"&gt;<br>&nbsp;&nbsp;&lt;list&gt;<br>&nbsp;&nbsp;&lt;value&gt;com/yourcompany/model/Login.hbm.xml<br>&nbsp;&nbsp;&lt;/value&gt;<br>&nbsp;&nbsp;&lt;/list&gt;<br>&nbsp;&nbsp;&lt;/property&gt; <br><br><br>2007-06-26 18:38:13,671 ERROR [com.yourcompany.model.dao.LoginDAO] - &lt;save failed&gt;<br>org.springframework.jdbc.BadSqlGrammarException: Hibernate operation: could not insert: [com.yourcompany.model.Login]; bad SQL grammar [insert into mysql__login (name, password) values (?, ?)]; nested exception is java.sql.SQLException: Table 'mysql.mysql__login' doesn't exist<br>java.sql.SQLException: Table 'mysql.mysql__login' doesn't exist<br><br>把hbm文件里面的catalog="'mysql"去掉即可！<br>另注意的一点是eclipse生成的DAO文件应该是：<br>&nbsp;&nbsp;&nbsp; public void save(Login transientInstance) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("saving Login instance");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getHibernateTemplate().save(transientInstance);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("save successful");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (RuntimeException re) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.error("save failed", re);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw re;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>而不是原来的&nbsp;&nbsp;&nbsp; public void save(LoginDAO transientInstance) <br><br>只要在applicationContext.xml中加上 <br>&lt;property name="mappingResources"&gt; <br>&lt;list&gt; <br>&lt;value&gt;com/yourcompany/hibernate/Users.hbm.xml&lt;/value&gt; <br>&lt;/list&gt; <br>&lt;/property&gt; <br>加这段代码就会找不到action<br>换一个版本的hibernate应该就ok<br><br><br>Invalid path /addcustomer was requested<br>输入的路径不正确，检查spring中注册的action的路径和输入的路径是否一致，留意大小写是否一致</p>
<img src ="http://www.blogjava.net/lzj520/aggbug/125513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lzj520/" target="_blank">lzj520</a> 2007-06-21 12:01 <a href="http://www.blogjava.net/lzj520/archive/2007/06/21/125513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>