|
该帖已经被评为精华帖
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2004-03-18
最近这一个阶段一直在研究hibernate,总感觉好象什么地方特别扭,研究一段时间,看了论坛上的各位大虾和小虾写的例子,自己也写了一个,在这里贴出来,希望得到大家的批评指正,特别是在架构上如何设计给些意见,因为对照关系如一对一,一对多的实现论坛的例子已经很清楚了.
开发环境: struts 1.1 tomcat4.1.24 hibernate2.1.2 oracle 8.16 表﹕company id 公司ID company_name 公司名稱 配置就不說了﹐ po:company.java [code:1]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; } }[/code:1] company持久類對應的映射文件﹕ company.hbm.xml [code:1]<?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>[/code:1] 配置文件hibernate.cfg.xml [code:1]<!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>[/code:1] 提供session的类HebernateSessionFactory(利用Thread管理session) [code:1]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(); } } [/code:1] 封装CRUD操作的类(我觉的此类应该设置为abstract类) [code:1]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; } } [/code:1] 在filter中关闭session,这个filter还可以用于字符集转换. HibernateFilter.java [code:1]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() { } }[/code:1] 以上是hibernate相关部分. 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2004-03-17
companyDAO.java 是个接口.
[code:1]public interface CompanyDAO { public void addCompany(Company company) throws HibernateException; }[/code:1] 工厂类HibernateDAOFactory.java [code:1]public class HibernateDAOFactory implements DAOFactory{ public static Object getInstance(String subClassName) throws ClassNotFoundException, InstantiationException, IllegalAccessException{ return (Class.forName(subClassName).newInstance()); } }[/code:1] DAO的实现类CompanyDAOImpl [code:1]public class CompanyDAOImpl implements CompanyDAO{ public void addCompany(Company company) throws HibernateException{ HibernateUtil.add(company); } }[/code:1] struts的action类只负责控制转发CompanyAction.java [code:1]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"); } }[/code:1] |
|
| 返回顶楼 | |
|
最后更新时间:2004-03-17
下面是相关的两个页面.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> |
|
| 返回顶楼 | |
|
最后更新时间:2004-03-19
请问能放出源码?
|
|
| 返回顶楼 | |
|
最后更新时间:2004-03-22
可以,另外,说明的是,本例子很简单,旨在和大家来讨论在架构上如何设计.以使二者能够发挥各自的优势.
|
|
| 返回顶楼 | |
|
最后更新时间:2004-03-22
哥们,我看了你的代码,你的DAOFactory里面什么都没有,我不知道你的DAOFactory有什么意思,那还不如,直接退化成简单工厂模式,把这个DAOFactory接口去掉
|
|
| 返回顶楼 | |
|
最后更新时间:2004-03-23
前面的东西还能看得懂
后半部分就看不太懂了 能解释一下吗? 为什么要用Factory之类的? 这几个类之间又是什么关系? 不好意思,新手 |
|
| 返回顶楼 | |
|
最后更新时间:2004-03-25
其实也没什么,设计模式里有句话,面向接口编程,而不是面向实现编成.另外使用工厂模式以及上面的编写方法,主要为了系统以后维护方便,论坛中很多这样的贴子,
你可以搜索一下,本想和大家讨论讨论,但没有几个人给意见. |
|
| 返回顶楼 | |
|
最后更新时间:2004-03-25
另外,多谢aloneflasher的意见,本来DAOFctoryImpl中的方法是写到DAOFactory中的.然后在DAOFactoryImpl中实现的.但考虑到静态变量及方法可以直接引用,所以就设置了一个空接口.
|
|
| 返回顶楼 | |
|
最后更新时间:2004-03-28
几天没来了,谢谢你的源码。回去看看先。
:) |
|
| 返回顶楼 | |






