package test.bean; /** ?*作者:孫星 ?**/ public class TotalCharge { ? private String name; ? private Double fee; ? private java.util.Date chargeTimeBegin; ? private java.util.Date chargeTimeEnd; ? public TotalCharge() { ? } ? public String getName() { ? public TotalCharge(String name, Double fee, java.util.Date chargeTimeBegin, ? public void setName(String name) { ? public Double getFee() { ? public void setFee(Double fee) { ? public java.util.Date getChargeTimeBegin() { ? public void setChargeTimeBegin(java.util.Date chargeTimeBegin) { ? public java.util.Date getChargeTimeEnd() { ? public void setChargeTimeEnd(java.util.Date chargeTimeEnd) { |
package test.dao.impl; import java.util.*; import test.bean.*; import test.dao.*; import net.sf.hibernate.*; /** ?*作者:孫星 ?**/ public class TotalChargeDaoImple extends TotalChargeDao{ ???? ????//下面方法集成自TotalChargeDao ????public List statTotalCharge(Date statTimeBegin, Date statTimeEnd) throws DaoException{ ????????List res = new Vector();//將用于存放保存的結(jié)果集合 ????????Session session = null; ????????ScrollableResults srs?= null; ????????try{ ????????????session = HibernateSessionFactory.openSession();//得到一個Hibernate Session ????????????//下面創(chuàng)建一個匿名Query實例并調(diào)用它的scroll()方法返回以ScrollableResults形式組織的查詢結(jié)果 ????????????srs = session.createQuery(“select b.name, count(a.fee) mix(a.chargeBeginTime) max(a.chargeEndTime) from charge a, customer b where a.idCustomer = b.idCustomer and a.chargeBeginTime >=?? and a.chargeEndTime <?? gourp by a.idCustomer“).setDate(0, statTimeBegin).setDate(1, statTimeEnd).scroll(); ????????????//將查詢結(jié)果放入List保存 ????????????while(srs.next()){ ????????????????res.add(new TotalCharge(srs.getString(0), srs,getDouble(1), srs.getDate(2), srs.getDate(3))); ????????????} ????????}catch(HibernateException he){ ????????????;//loging err..... ????????????if(srs!=null){ ????????????????try{ ????????????????????srs.close(); ????????????????}catch(Exception e){ ????????????????????; ????????????????} ????????????} ????????}finally{ ????????????try{ ????????????????session.close(); ????????????}catch(Exception e){ ????????????????; ????????????} ????????} ????????return res; ????} } |
我在bean和.hbm.xml中用的是java.sql.Blob
以下是我的程序,在//1的地方正常通過,在//2地方抱類型轉(zhuǎn)換錯誤,java.lang.ClassCastException,
請各位指點,應(yīng)該怎么改?
import java.io.FileInputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import oracle.sql.BLOB;
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
public void insert()
{
Transaction tran = null;
try
{
tran = session.beginTransaction();
StyleSheetPicture pic = new StyleSheetPicture();
pic.setCmtorderno("JCHI-2000");
pic.setTitle("ht1");
pic.setType(new Integer(1));
pic.setFilename("f1");
pic.setKeyword("k1");
pic.setRawstream(BLOB.empty_lob());
pic.setDescription("d1");
pic.setSourceflag(new Integer(1));
pic.setUpdatedate(strtoSqlDate("2006-06-06"));
pic.setActiveflag(new Integer(1));
session.save(pic);//1
session.flush();
session.refresh(pic,LockMode.UPGRADE);
oracle.sql.BLOB blob = ((oracle.sql.BLOB)pic.getRawstream());//2
OutputStream os = blob.getBinaryOutputStream();
FileInputStream fis = new FileInputStream("C:\\hb1.jpg");
byte[] buf = new byte[10240];
int len = 0;
while((len = fis.read(buf)) > 0)
{
os.write(buf,0,len);
}
fis.close();
os.close();
session.save(pic);
tran.commit();
}
catch (HibernateException e)
{
e.printStackTrace();
if(tran != null)
{
try
{
tran.rollback();
}
catch(HibernateException e1)
{
e1.printStackTrace();
}
}
}
catch (Exception e)
{
e.printStackTrace();
if(tran != null)
{
try
{
tran.rollback();
}
catch(Exception e1)
{
e1.printStackTrace();
}
}
}
finally
{
tran = null;
}
}
你可以跟蹤一下程序,看看到//2的位置時,取出的pic.getRawstream()是什么類型
pic.getRawstream()的類型是org.hibernate.lob.SerializableBlob
(oracle.sql.BLOB) 那你用這個轉(zhuǎn)型肯定會ClassCastException
你查一下SerializableBlob的API,看看這個有沒有其他的轉(zhuǎn)換方法
oracle.sql.BLOB blob = (org.hibernate.lob.SerializableBlob)pic.getRawstream();//2
OutputStream os = blob.setBinaryStream(long pos);
SerializableBlob的setBinaryStream(long pos) 方法就是返回你所需要的OutputStream
但是這個long參數(shù)不知道該傳什么,API上沒有明確指明
http://www.hibernate.org/hib_docs/v3/api/org/hibernate/lob/SerializableBlob.html#setBinaryStream(long)
說明:
??? 這個手冊只是為初學(xué)者制作的環(huán)境配置和快速開發(fā)的一些基本方法,為的是廣大愛好者能快速上手,少走我走過的彎路,里面沒有任何關(guān)于java模式和其他相關(guān)的說明。本人水平有限,也沒有能力去討論關(guān)于模式設(shè)計和開發(fā)細節(jié)的一些內(nèi)容。
建議:
??? 如果你還不清楚struts和hibernate的一些基本原理,希望能先去了解一下這方面的相關(guān)內(nèi)容。
推薦:
??? 《Hibernate中文手冊》作者認為要學(xué)Hibernate看這個就足夠了,里面幾乎包括了所有的細節(jié),不過可能不太適合快速入門。
地址:http://www.hibernate.org/hib_docs/v3/reference/zh- cn/html_single/
??? 關(guān)于struts的資料就很多了,這里推薦一個可以下載一些入門教程的網(wǎng)站。
地址:http://www.wnetw.com/jclub/index.jsp
&nbs p;?? 強烈建議入門的朋友先了解一下基本的原理!否則本文章可能對你沒有任何幫助。
相關(guān)工具下載:(注意版本)
????mysql5.0 http://www.mysql.org
??? eclipse 3.1.1 http://www.eclipse.org
??? myeclipse4.0.3 http://www.myeclipseide.com
???&nb sp;tomcat5.5
安裝:
??? 關(guān)于tomcat和mysql的安裝就不多說了,需要注意的是最好保證你的 jdk是1.5的版本,并配置好你的環(huán)境變量,不然可能會遇到一些問題。
?把eclipse解開,再去安裝剛下載的myeclipse,在安裝的時候需要把路徑指定到剛才解開的eclipse上,由于myeclipse是個收費軟件,所以需要注冊。不過一般按照Chinese的習(xí)慣,去google一個注冊碼就可以了:}
開發(fā)環(huán)境部署:
?好了,現(xiàn)在保證你的mysql和tomcat服務(wù)能夠正常啟動,myeclipse能夠正常打開(如果不能,可以去找一下相關(guān)的說明或者給作者留言)。下面我們就要開始真正的開始部署一個傳說中的tomcat+struts+hibernate+mysql結(jié)構(gòu)的工程了!(faint!前言就寫的我好累)
?首先,在myeclipse里新建一個工程。在左邊的Package Exporler面版里點右鍵選擇new->project…
?在跳出菜單里選擇MyEclipse->J2EE Projects->Web Project。
?點擊next后進入如下畫面:
?工程名為:test
?結(jié)束后點擊Finish。
?好了,如果成功的話你就會在 Package Exporler里看到一個新的test工程!現(xiàn)在我們先配置一下數(shù)據(jù)庫方面的東西。首先在你的mysql 里建立一個數(shù)據(jù)庫webases,再在里面新建一個表admin,里面三個字段分別為id,name,password其中id為自動取值的主鍵(mysql具體的操作可以自己找資料,不是本文涉及范圍)。
?再回到myeclipse ,選中window->Open Perspective->Other…
?可以看到現(xiàn)在跳出一個名為Select Perspective的菜單,在里面選中MyEclipse Databases Exporler,可以看到現(xiàn)在到了下面的頁面。
按以上圖示輸入相關(guān)字段后點擊Finish便建立了一個數(shù)據(jù)庫連接,在新出現(xiàn)的JDBC for Mysql上點右鍵,選擇Open connection…,確認用戶名和密碼正確后點OK,如果一切順利的話你會看到下面的畫面:
?這說明你已經(jīng)和數(shù)據(jù)庫建立了正確的連接。現(xiàn)在我們再回到window->Open Perspective- >Other…里的MyEclipse,也就是我們剛進來的時候看到的畫面。
?右鍵點擊你剛建立的工程 test并選擇MyEclipse->Add struts Capabilities…在跳出的菜單里按照如下輸入并確定:
?好了,現(xiàn)在你已經(jīng)為你的工程增加了struts,接下來和上面一樣在右鍵工程后選擇MyEclipse- >Add Hibernate Capabilities…一路確定下來為你的工程添加Hibernate。(為方便起見我們在選擇路徑時把HibernateSessionFactory.java放在了src/com下面,其實最好建立個單獨的目錄如 src/com/hibernate)
?為了更好的演示我們不建立通常的登陸頁面而是建立個注冊頁面。選擇 src目錄下的hibernate.cfg.xml文件。照如下填寫并保存。這樣hibernate就為你建立了數(shù)據(jù)庫的連接池。
?下面我們再選擇WebRoot/WEB-INF/struts-config.xml文件,在畫面中點擊右鍵選擇new- >Form, Action and JSP。如下填寫
?再選擇JSP選項,如下
?最后選擇Finish。
?再新建一個一個success.jsp的頁面,
?在剛才struts- config.xml文件里右鍵選擇addAdmin選擇Properties,在菜單里選擇Forwords,再點add,如下圖填寫
?最后你的struts-config.xml就是下面這個樣子:
?下面我們轉(zhuǎn)到hibernate。換到剛才我們建立數(shù)據(jù)庫的頁面,選擇你的admin的表點右鍵選擇Create Hibernate Mapping。選擇好打包路徑后選擇Finish。如圖:
?在你剛才選擇的路徑下(我為方便是src/com/yourcompanyname/)下新建立的文件 AdminDAOFactory.java文件并輸入以下內(nèi)容:
package com.yourcompanyname;
import java.util.Iterator;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.hibernate.SessionFactory;
public class AdminDAOFactory {
?Session session;
?Transaction tx;
?public void add(Admin admin) throws HibernateException {
??/**
?? * Creation Date: 11-17-2005
?? * TODO Add a new admin user.
?? * @param An object of Admin
?? * @return void
?? * @author Coder Guo
?? */
??try {
???session = SessionFactory.currentSession();
???tx = session.beginTransaction();
???//Add a new admin
???session.save(admin);
???tx.commit ();
??}catch(HibernateException e){
???throw e;
??}finally{
???if (tx!=null) {
????tx.rollback();
???}
???SessionFactory.closeSession();
??}
?}
}
?再打開com.yourcompany.struts.action下的AddAdminAction.java添加(其中如果有錯誤選中好按ctrl+shift+o自動添加包)
public class AddAdminAction extends Action {
?// --------------------------------------------------------- Instance Variables
?// --------------------------------------------------------- Methods
?/**
? * Method execute
? * @param mapping
? * @param form
? * @param request
? * @param response
? * @return ActionForward
? * @author Coder Guo
? */
?public ActionForward execute(
??ActionMapping mapping,
??ActionForm form,
??HttpServletRequest request,
??HttpServletResponse response) {
??AddAdminForm addAdminForm = (AddAdminForm) form;
??
??// TODO Add a new admin
??Admin admin = new Admin();
??admin.setName(addAdminForm.getName ());
??admin.setPassword(addAdminForm.getPassword ());
??AdminDAOFactory adminDAO = new AdminDAOFactory ();
??adminDAO.add(admin);
??
??return mapping.findForward("success");
?}
}
?再打開com.yourcompanyname.struts.form下的AddAdminForm.java,修改(如果有錯誤按照上面說的方法導(dǎo)入包)
?public ActionErrors validate(
??ActionMapping mapping,
??HttpServletRequest request) {
??// TODO Auto-generated method stub
??ActionErrors errors = new ActionErrors();
??
??Session session = SessionFactory.currentSession();
??Transaction tx = session.beginTransaction ();
??Query query = session.createQuery("select admin from Admin as admin where admin.name = '" + this.name + "'");
??Iterator it = query.iterate ();
??if (it.hasNext()){
???errors.add ("addAdmin.err.name",new ActionMessage("form.addAdmin.err.name"));
??}
??tx.commit();
??SessionFactory.closeSession ();
??return errors;
?}
?public void reset(ActionMapping mapping, HttpServletRequest request) {
??// TODO Auto-generated method stub
??this.name=null;
??this.password=null;
?}
再打開com\yourcompanyname\struts下的ApplicationResource.properties在這里面添加錯誤信息:
Form.addAdmin.err.name=err
最后,(汗,好累啊-_-!)打開addAdmin.jsp修改成如下: <script language = "javascript"> ? <body> </html:html>
?在項目文件點右鍵->“myeclipse”->“Add and remove project deployment”,如下圖:
?好了,我們的配置工作基本結(jié)束了,在myeclipse上開啟tomcat服務(wù)
現(xiàn)在打開瀏覽器,輸入
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page language="java"%>
<%@ taglib uri="<%@ taglib uri="
<!--
function check(){
?if (loginForm.userName.value == "" || loginForm.password.value == ""){
??alert("請輸入完整的信息!");
??loginForm.userName.focus();
??return false;
?}
}
//-->
</script>
?
?<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html>
? <head>
??? <html:base />
???
??? <title>login.jsp</title>
??? <link href="css/webcss.css" rel="stylesheet" type="text/css">
???
??? <meta http-equiv="pragma" content="no- cache">
??? <meta http-equiv="cache-control" content="no- cache">
??? <meta http-equiv="expires" content="0">???
??? <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
??? <meta http- equiv="description" content="This is my page">
? </head>
?
? <center>
? ?<p> </p>
? ?<p> </p>
? ?<table width="300" border="0" cellpadding="0" cellspacing="0">
? ?<html:form action="/addAdmin" focus="name" method="GET">
??? ?<tr align="center" valign="middle">
????? ?<td colspan="2" class="typt_normal">新增管理員</td>
??? ?</tr>
??? ?<tr>
????? ?<td width="100" align="center" valign="middle" class="typt_normal">名稱: </td>
????? ?<td width="200" align="left"><html:text property="name" styleClass="text_s"/><html:errors property="addAdmin.err.name"/></td>
??? ?</tr>
??? ?<tr>
????? ?<td width="100" align="center" valign="middle" class="typt_normal">密碼: </td>
????? ?<td width="200" align="left"><html:password property="password" styleClass="text_s"/></td>
??? ?</tr>
??? ?<tr>?
????? ?<td colspan="2" align="center" valign="middle"><html:submit value="提交" onclick="return check ();"/><html:reset value="重置"></html:reset></td>
????? ?</tr>
?</html:form>
? ?</table>
?</center>
?</body>
其中可以看到如何在struts的標簽中使用javascript的方法。
?配置好myeclipse于tomcat的連接。在window->Preferences做如下設(shè)定:
http://127.0.0.1:8080/test/addAdmin.jsp就可以看到你的jsp頁面了!
閱讀導(dǎo)航 | |
“Hello World” | “Hello world”示例程序讓您對Hibernate有一個簡單的認識。 |
理解Hibernate的架構(gòu) | 介紹Hibernate接口的主要功能。 |
核心接口 | Hibernate有5個核心接口,通過這幾個接口開發(fā)人員可以存儲和獲得持久對象,并且能夠進行事務(wù)控制 |
一個重要的術(shù)語:Type | Type是Hibernate發(fā)明者發(fā)明的一個術(shù)語,它在整個構(gòu)架中是一個非常基礎(chǔ)、有著強大功能的元素,一個Type對象能將一個Java類型映射到數(shù)據(jù)庫中一個表的字段中去。 |
策略接口 | Hibernate與某些其它開源軟件不同的還有一點――高度的可擴展性,這通過它的內(nèi)置策略機制來實現(xiàn)。 |
基礎(chǔ)配置 | Hibernate可以配置成可在任何Java環(huán)境中運行,一般說來,它通常被用在2-3層的C/S模式的項目中,并被部署在服務(wù)端。 |
創(chuàng)建一個SessionFactory對象 | 要創(chuàng)建一個SessionFactory對象,必須在Hibernate初始化時創(chuàng)建一個Configuration類的實例,并將已寫好的映射文件交由它處理。 |
package hello; public class Message { private Long id; private String text; private Message nextMessage; private Message() {} public Message(String text) { this.text = text; } public Long getId() { return id; } private void setId(Long id) { this.id = id; } public String getText() { return text; } public void setText(String text) { this.text = text; } public Message getNextMessage() { return nextMessage; } public void setNextMessage(Message nextMessage) { this.nextMessage = nextMessage; } } |
Message message = new Message("Hello World"); System.out.println( message.getText() ); |
Session session = getSessionFactory().openSession(); Transaction tx = session.beginTransaction(); Message message = new Message("Hello World"); session.save(message); tx.commit(); session.close(); |
insert into MESSAGES (MESSAGE_ID, MESSAGE_TEXT, NEXT_MESSAGE_ID) values (1, 'Hello World', null) |
Session newSession = getSessionFactory().openSession(); Transaction newTransaction = newSession.beginTransaction(); List messages =newSession.find("from Message as m order by m.text asc"); System.out.println( messages.size() + " message(s) found:" ); for ( Iterator iter = messages.iterator(); iter.hasNext(); ) { Message message = (Message) iter.next(); System.out.println( message.getText() ); } newTransaction.commit(); newSession.close(); |
select m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID from MESSAGES m order by m.MESSAGE_TEXT asc |
1 message(s) found: Hello World |
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping> <class name="hello.Message" table="MESSAGES"> <id name="id" column="MESSAGE_ID"> <generator class="increment"/> </id> <property name="text" column="MESSAGE_TEXT"/> <many-to-one name="nextMessage" cascade="all" column="NEXT_MESSAGE_ID"/> </class> </hibernate-mapping> |
Session session = getSessionFactory().openSession(); Transaction tx = session.beginTransaction(); // 1 is the generated id of the first message Message message =(Message) session.load( Message.class, new Long(1) ); message.setText("Greetings Earthling"); Message nextMessage = new Message("Take me to your leader (please)"); message.setNextMessage( nextMessage ); tx.commit(); session.close(); |
select m.MESSAGE_ID, m.MESSAGE_TEXT, m.NEXT_MESSAGE_ID from MESSAGES m where m.MESSAGE_ID = 1 insert into MESSAGES (MESSAGE_ID, MESSAGE_TEXT, NEXT_MESSAGE_ID) values (2, 'Take me to your leader (please)', null) update MESSAGES set MESSAGE_TEXT = 'Greetings Earthling', NEXT_MESSAGE_ID = 2 where MESSAGE_ID = 1 |
2 message(s) found: Greetings Earthling Take me to your leader (please) |
![]() |
Configuration cfg = new Configuration(); cfg.addResource("hello/Message.hbm.xml"); cfg.setProperties( System.getProperties() ); SessionFactory sessions = cfg.buildSessionFactory(); |
SessionFactory sessions = new Configuration() .addClass(org.hibernate.auction.model.Item.class) .addClass(org.hibernate.auction.model.Category.class) .addClass(org.hibernate.auction.model.Bid.class) .setProperties( System.getProperties() ) .buildSessionFactory(); |