最近这一个阶段一直在研究hibernate,总感觉好象什么地方特别扭,研究一段时间,看了论坛上的各位大虾和小虾写的例子,自己也写了一个,在这里贴出来,希望得到大家的批评指正,特别是在架构上如何设计给些意见,因为对照关系如一对一,一对多的实现论坛的例子已经很清楚了.
开发环境:
struts 1.1
tomcat4.1.24
hibernate2.1.2
oracle 8.16
表﹕company
id 公司ID
company_name 公司名稱
配置就不說了﹐
po:company.java
company持久類對應的映射文件﹕
company.hbm.xml
配置文件hibernate.cfg.xml
提供session的类HebernateSessionFactory(利用Thread管理session)
封装CRUD操作的类(我觉的此类应该设置为abstract类)
在filter中关闭session,这个filter还可以用于字符集转换.
HibernateFilter.java
以上是hibernate相关部分.
companyDAO.java 是个接口.
工厂类HibernateDAOFactory.java
DAO的实现类CompanyDAOImpl
struts的action类只负责控制转发CompanyAction.java
下面是相关的两个页面.index.jsp和保存后成功页面success.jsp
index.jsp
<%@ page contentType="text/html; charset=Big5" %>
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<html:html>
<head>
<link href="<%= request.getContextPath() %>/style/SelfCss.css" rel="stylesheet" type="text/css">
</head>
<body>
<html:form action="company.do?action=saveCompany">
<table>
<tr>
<td>Company ID:</td>
<td><html:text property="id" /></td>
</tr>
<tr>
<td>Company Name:</td>
<td><html:text property="name" /></td>
</tr>
<tr>
<td><html:submit value="submit" /></td>
<td><html:reset value="reset"/></td>
</tr>
</table>
</html:form>
</body>
</html:html>
success.jsp 此画面用来输出成功插入的信息!
<html:html>
<body>
Successful!!!
</body>
</html:html>
开发环境:
struts 1.1
tomcat4.1.24
hibernate2.1.2
oracle 8.16
表﹕company
id 公司ID
company_name 公司名稱
配置就不說了﹐
po:company.java
java代码: |
public class Company { private String id; private String companyname; public String getId ( ) { return id; } public String getCompanyname ( ) { return companyname; } public void setId ( String id ) { this. id=id; } public void setCompanyname ( String companyname ) { this. companyname=companyname; } } |
company持久類對應的映射文件﹕
company.hbm.xml
java代码: |
<?xml version=" 1. 0"?> <!DOCTYPE hibernate-mapping PUBLIC "- //Hibernate/Hibernate Mapping DTD 2.0//EN" "http: //hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping> < class name="com. foxconn. hibernate. po. Company" table="company" dynamic-update=" false"> <id name="id" column="id" type="string" unsaved-value="any" > <generator class="assigned"> </generator> </id> <property name="companyname" type="string" update=" true" insert=" true" column="company_name"/> </ class> </hibernate-mapping> |
配置文件hibernate.cfg.xml
java代码: |
<!DOCTYPE hibernate-configuration PUBLIC "- //Hibernate/Hibernate Configuration D TD //EN" "http://hibernate.sourceforge.net/hibernate-configuration-2.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection. datasource">java:comp/env/jdbc/fox221</property> <property name="show_sql"> false</property> <property name="dialect">net. sf. hibernate. dialect. OracleDialect</property> <property name="jdbc. fetch_size"> 50</property> <property name="jdbc. batch_size"> 30</property> <!-- Mapping files --> <mapping resource="/hbm/Company. hbm. xml"/> </session-factory> </hibernate-configuration> |
提供session的类HebernateSessionFactory(利用Thread管理session)
java代码: |
public class HibernateSessionFactory { public static final ThreadLocal session = new ThreadLocal ( ); private static SessionFactory sessionFactory; static { try { sessionFactory = new Configuration ( ). configure ( ). buildSessionFactory ( ); } catch (HibernateException ex ) { throw new RuntimeException ( " Exception building SessionFactory: " + ex. getMessage ( ),ex ); } } public static Session currentSession ( ) throws HibernateException { Session s = (Session ) session. get ( ); if (s == null ) { s = sessionFactory. openSession ( ); session. set (s ); } return s; } public static void closeSession ( ) throws HibernateException { Session s = (Session ) session. get ( ); session. set ( null ); if (s != null ) s. close ( ); } } |
封装CRUD操作的类(我觉的此类应该设置为abstract类)
java代码: |
public class HibernateUtil { public static void add ( Object object ) throws HibernateException { Session s = HibernateSessionFactory. currentSession ( ); s. save ( object ); s. flush ( ); s. beginTransaction ( ). commit ( ); } public static void update ( Object object ) throws HibernateException { Session s = HibernateSessionFactory. currentSession ( ); s. beginTransaction ( ); s. saveOrUpdate ( object ); s. flush ( ); } public static void remove ( Class clazz, String id ) throws HibernateException { Session s = HibernateSessionFactory. currentSession ( ); s. beginTransaction ( ); Object object = s. load (clazz, id ); s. delete ( object ); s. flush ( ); } public static Object findById ( Class clazz, String id ) throws HibernateException { Object obj = null; Session s = HibernateSessionFactory. currentSession ( ); obj = s. load ( clazz, id ); s. flush ( ); return obj; } } |
在filter中关闭session,这个filter还可以用于字符集转换.
HibernateFilter.java
java代码: |
public class HibernateFilter implements Filter { private String encode = "big5"; public void init (FilterConfig config ) { this. encode = config. getInitParameter ("encode" ); } public void doFilter (ServletRequest request, ServletResponse response, FilterChain chain ) { try { request. setCharacterEncoding (this. encode ); response. setContentType ("text/html;charset="+encode ); chain. doFilter (request, response ); } catch ( Exception e ) { if (! (e instanceof java. net. SocketException ) ) { if (request instanceof HttpServletRequest ) Logger. getLogger (this. getClass ( ) ). error ("error request uri:"+ ( (HttpServletRequest )request ). getRequestURI ( ) ); Logger. getLogger (this. getClass ( ) ). error (e ); } } finally { try { HibernateSessionFactory. closeSession ( ); } catch ( Exception ex ) { System. out. println (" Error in closing session" ); } } } public void destroy ( ) { } } |
以上是hibernate相关部分.
companyDAO.java 是个接口.
java代码: |
public interface CompanyDAO { public void addCompany (Company company ) throws HibernateException; } |
工厂类HibernateDAOFactory.java
java代码: |
public class HibernateDAOFactory implements DAOFactory { public static Object getInstance ( String subClassName ) throws ClassNotFoundException, InstantiationException, IllegalAccessException { return ( Class. forName (subClassName ). newInstance ( ) ); } } |
DAO的实现类CompanyDAOImpl
java代码: |
public class CompanyDAOImpl implements CompanyDAO { public void addCompany (Company company ) throws HibernateException { HibernateUtil. add (company ); } } |
struts的action类只负责控制转发CompanyAction.java
java代码: |
public class CompanyControl extends DispatchAction { public ActionForward saveCompany (ActionMapping mapping,ActionForm form ,HttpServletRequest request,HttpServletResponse response ) throws Exception { HttpSession session = request. getSession ( ); String id=request. getParameter ("id" ); String name=request. getParameter ("name" ); Company company= new Company ( ); company. setId (id ); company. setCompanyname (name ); CompanyDAO companyDAO= (CompanyDAO )HibernateDAOFactory. getInstance ("CompanyDAOImpl" ); companyDAO. addCompany (company ); return mapping. findForward ("success" ); } } |
index.jsp
<%@ page contentType="text/html; charset=Big5" %>
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<html:html>
<head>
<link href="<%= request.getContextPath() %>/style/SelfCss.css" rel="stylesheet" type="text/css">
</head>
<body>
<html:form action="company.do?action=saveCompany">
<table>
<tr>
<td>Company ID:</td>
<td><html:text property="id" /></td>
</tr>
<tr>
<td>Company Name:</td>
<td><html:text property="name" /></td>
</tr>
<tr>
<td><html:submit value="submit" /></td>
<td><html:reset value="reset"/></td>
</tr>
</table>
</html:form>
</body>
</html:html>
success.jsp 此画面用来输出成功插入的信息!
<html:html>
<body>
Successful!!!
</body>
</html:html>