Hibernate 学习

Hibernate的session接口的update()方法可以更新持久化对象.使其对象属性的状态改变传递到数据库.

public boolean updateNews(Devinfo df) throws HibernateException{

net.sf.hibernate.Session sess =HibernateUtil.currentSession();
Transaction tx = sess.beginTransaction();
try{
Devinfo d=new Devinfo();
sess.load(d,df.getNewsid());
d.setTypeId(df.getTypeId());
d.setSubject(df.getSubject());
d.setContent(df.getContent());
d.setMdate(new Date((new java.util.Date()).getTime()).toString());
sess.update(d);
tx.commit();
HibernateUtil.closeSession();
return true;
}
catch(HibernateException e){
e.printStackTrace();
return false;
}
}

Jason   2005-08-15 23:09:23 阅读:5316  评论:2  引用:0
这是一个简单分页的的showAllNews.jsp:这儿仅是简单的实现.上下页部分还需大家去完善.

//showAllNews.jsp
<%@ page contentType=
"text/html; charset=GB2312" %>
<%@ page import=
"com.*, net.sf.hibernate.*,java.util.*" %>
<%@include file=
"trans.jsp"%>

<html>
<head>
<title>Hibernate Test</title>
<%
//清除缓存
response.setHeader(
"Pragma","no-cache");
response.setHeader(
"Cache-Control","no-cache");
response.setDateHeader(
"Expires",0);
%>
</head>
<table width=
"100%" border="1" align="center" cellpadding="0" cellspacing="0">
<tr>
<td width=
"145">ID号</td>
<td width=
"54">类别</td>
<td width=
"471">主题</td>
<td width=
"144">发布时间</td>
<td width=
"145">管理</td>
</tr>



<%
String nums=request.getParameter(
"num");
if(nums==null)nums=
"0";
int num=0;
num=Integer.parseInt(nums);
net.sf.hibernate.Session hsession = HibernateUtil.currentSession();
Transaction tx = hsession.beginTransaction();

Criteria c =hsession.createCriteria(Devinfo.class);
c.setFirstResult(num);
c.setMaxResults(5);

//Query query = hsession.createQuery ("from Devinfo");

List list=c.list();
for (Iterator it = list.iterator(); it.hasNext();) {

Devinfo devinfo = (Devinfo) it.next();
%>
<tr>
<td><%=devinfo.getNewsid()%></td>
<td><%=devinfo.getTypeId()%></td>
<td><%=trans(devinfo.getSubject())%></td>
<td><%=devinfo.getCdate()%></td>
<td><a href=editNews.jsp?newsid=<%=devinfo.getNewsid()%>>编辑</a> <a href=delNews.jsp?newsid=<%=devinfo.getNewsid()%>> 删除</a></td>
</tr>
<%
}
hsession.flush();
tx.commit();
HibernateUtil.closeSession();
%>
</table>
<p><a href=showAllNews.jsp>首页</a> <a href=showAllNews.jsp?num=<%=num+5%>>下一页</a> <a href=showAllNews.jsp?num=<%=num-5%>>上一页</a></center>
</body>
</html>
Jason   2005-08-14 08:54:58 阅读:3904  评论:2  引用:0
前言:最近,主要是研究了hibernate,主要是新手,所以进步不大!希望这一方法能够起到抛砖引玉的作用,以后Hibernate这些文章会多一些!供大家参考.

public boolean delNews(String newsid) throws HibernateException{
net.sf.hibernate.Session sess = HibernateUtil.currentSession();
Transaction tx = sess.beginTransaction();
Devinfo d = new Devinfo();
sess.load(d,newsid);
sess.delete(d);
tx.commit();
try{
HibernateUtil.closeSession();
return true;
}
catch(HibernateException e){
e.printStackTrace();
return false;
}
}

Hibernate的session接口提供了删除持久化对象delete()的方法,由于持久化对象对应数据库中数据表的一行记录,所以在session删除持久化类对象的同时,数据表中的对应行也被删除了.
Jason   2005-08-13 23:21:29 阅读:6786  评论:2  引用:0

http://www.hibernate.org.cn/viewtopic.php?t=9706&postdays=0&postorder=asc&start=0

Jason   2005-04-13 20:47:51 阅读:808  评论:0  引用:0
为了能创建一个SessionFactory对象,你必须在Hibernate初始化时创建一个Configuration类的实例,并将已写好的映射文件交由它处理。这样,Configuration对象就可以创建一个SessionFactory对象,当SessionFactory对象创建成功后,Configuration对象就没有用了,你可以简单地抛弃它。如下是示例代码:

Configuration cfg = new Configuration();
cfg.addResource(
"hello/Message.hbm.xml");
cfg.setProperties( System.getProperties() );
SessionFactory sessions = cfg.buildSessionFactory();

  在以上代码中,Message.hb.xml这个映射文件的位置比较特殊,它与当前的classpath相关。例如classpath包含当前目录,那在上述代码中的Message.hbm.xml映射文件就可以保存在当前目录下的hello目录中。

  作为一种约定,Hibernate的映射文件默认以.htm.xml作为其扩展名。另一个约定是坚持为每一个持久类写一个配置文件,想一想如果你将所有持久类的映射写入一个单独的配置文件中的话,那这个配置文件肯定非常庞大,不易维护。但这里又出现了一个新问题:如果为每个类写一个配置文件的话,这么多的配置文件应该存放在哪里呢?

  Hibernate推荐你将每个映射文件保存在与持久类相同的目录下,并且与持久类同名。例如我们第一个示例程序中的Message持久类放在hello目录下,那你必须在这个目录下存放名为Message.hbm.xml的映射文件。这样一个持久类都有自己的一个映射文件,避免了出现像struts项目中的“struts-config.xml地狱”的情况。如果你不遵循这种规定,那你必须手动地用addResource()方法将一个个的映射文件载入;但你如果遵循这种规定,那你可以方便地用addClass()方法同时将持久类和它的映射文件载入,以下是体现这种便利性的示例代码:

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();

  当然,Hibernate的映射文件还有很多其它的配置选项,比如数据库连接的设定,或是能够改变Hibernate运行时行为的一些设定。所有的设置可能是非常庞杂的,足以让你喘不过气来,但是不必担心,因为Hibernate为绝大多数值都设定了一个合理缺省值,你只需要修改这些配置文件中的极小一部分值。

  你可以通过以下几种方式来修改Hibernate的系统配置参数:

  ? 将一个Java.util.Properties实例作为参数传给Configuration类的setProperties()方法。

  ? 在Hibernate启动时用Java ?CDproperty=value的方式设置值。

  ? 在classpath可以找到的路径下创建一个名为hibernate.properties的配置文件。

  ? 在classpath可以找到的路径下创建一个名为hibernate.cfg.xml的文件,并在其<property>标签中定义属性值。

  以上就是对Hibernate的一个大致?一点是毫无疑问的:它的确是一个非常优秀的持久层解决方案!
Jason   2005-04-11 20:53:50 阅读:1099  评论:0  引用:0
HibernateTest.java

import onlyfun.caterpillar.*;
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
import java.util.*;
public class HibernateTest {
public static void main(String[] args) throws HibernateException {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
List users = session.find(
"from User");
User updated = null;
for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {
User user = (User) iterator.next();
if(updated == null)
updated = user;
System.out.println(user.getName() +
"\n\tAge: " + user.getAge() + "\n\tSex: " + user.getSex());
}
session.delete(updated);
users = session.find(
"from User");
session.close();
sessionFactory.close();
for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {
User user = (User) iterator.next();
System.out.println(user.getName() +
"Age: "+user.getAge()+ "Sex: " +user.getSex());

}

}

}


Jason   2005-04-11 19:31:58 阅读:3371  评论:1  引用:0
1 .from

1.1单表查询

from eg.cat as cat.其中,cat只是一个别名,为了用其他子语句的时候书写简单

1.2多表查询

from eg.Cat,eg.Dog
from eg.Cat as cat,eg.Dog as dog
2 join相关
(inner) join
left (outer) join
right (outer) join
full join
HQL同样对SQL中的这些特性支持
下面插播一个小话题,关于上边的那些特性,我一直都没怎么用,今天既然说到这里,就想
把上边的几个特性的用法说一下,也算对自己的一个补充:
假设有两个表:部门、员工,下面列举一些数据:
员工(Employee):
ID Name DepNo
001 Jplateau 01
002 Jony 01
003 Camel 02
部门(Department):
ID Name
01 研发部
02 营销部

在Hibernate中我们操纵的都是对象,所以我们操纵的是部门类和员工类
1).(inner) join
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee join Department as department on employee.DepNo=
department.ID (注意到条件语句我用on 没有用where)
那么执行结果是什么呢?
id1 name1 id2 name2
++++++++++++++++++++++++++++++++++++++
001 Jplateau 01 研发部
002 Jony 01 研发部

2).left (outer) join
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee left join Department as department on employee.DepNo=
department.ID
那么执行结果又该是什么呢?
id1 name1 id2 name2
++++++++++++++++++++++++++++++++++++++
001 Jplateau 01 研发部
002 Jony 01 研发部
003 Camel null null
{就是说此时我要已第一个表的记录多少为准,第二个表中没有相应纪录的时候填充null}
3). right (outer) join
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee right join Department as department on employee.DepNo=
department.ID
那么执行结果又该是什么呢?
id1 name1 id2 name2
++++++++++++++++++++++++++++++++++++++
001 Jplateau 01 研发部
002 Jony 01 研发部
null null 02 营销部
{就是说此时我要已第二个表的记录多少为准,第一个表中没有相应纪录的时候填充null}

3 大小写敏感

4。select语句
就是要确定你要从查询中返回哪些对象或者哪些对象的属性。写几个例子吧:
select employee form Employee as employee
select employee form Employee as employee where employee.Name like 'J%'
select employee.Name form Employee as employee where employee.Name like 'J%'
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee right join Department as department on employee.DepNo=
department.ID

select elements(employee.Name) from Employee as employee
(不明白elements到底是做什么用的?望给于说明)
等等
5。数学函数
JDO目前好像还不支持此类特性。
avg(...), sum(...), min(...), max(...)

count(*)

count(...), count(distinct ...), count(all...)

其用法和SQL基本相同

select distinct employee.name from Employee as employee
select count(distinct employee.name),count(employee) from Employee as employee

6。polymorphism (暂时不知道如何解释?)
from com.test.Animal as animal
不光得到所有Animal得实例,而且可以得到所有Animal的子类(如果我们定义了一个子类Cat)
一个比较极端的例子
from java.lang.Object as o
可以得到所有持久类的实例

7。where语句
定义查询语句的条件,举几个例子吧:
from Employee as employee where employee.Name='Jplateau'
from Employee as employee where employee.Name like 'J%'
from Employee as employee where employee.Name like '%u'
在where语句中“=”不光可以比较对象的属性,也可以比较对象,如:
select animal from com.test.Animal as animal where animal.name=dog

8。表达式

在SQL语句中大部分的表达式在HQL中都可以使用:
mathematical operators +, -, *, /

binary comparison operators =, >=, <=, <>, !=, like

logical operations and, or, not

string concatenation ||

SQL scalar functions like upper() and lower()

Parentheses ( ) indicate grouping

in, between, is null

JDBC IN parameters ?

named parameters :name, :start_date, :x1 (这种应该是另一种"?"的变通解决方法)

SQL literals 'foo', 69, '1970-01-01 10:00:01.0'

Java public static final constants eg.Color.TABBY

其他不必解释了,在这里我只想对查询中的参数问题说明一下:
大家知道在SQL中进行传递参数进行查询的时候,我们通常用PreparedStatement,在语句中写一大堆的“?”,
在hql中也可以用这种方法,如:
List mates = sess.find(
"select employee.name from Employee as employee " +
"where employee.Name=? ",
name,
Hibernate.STRING
);
(说明:上面利用Session里的find方法,在hibernate的api Session中重载了很多find方法,它可以满足你多种形式的查询)
上边是一个参数的情形,这种情况下紧接着引入参数和定义参数的类型,当为多个参数,调用另一个find方法,它的后两个
参数都是数组的形式。

还有另外一种方法来解决上边的问题,JDO也有这样的方法,不过和hibernate的表现形式上有差别,但他们两个骨子里却是
一样的,如:
Query q = sess.createQuery("select employee.name from Employee as employee where employee.Name=:name");
q.setString("name", "Jplateau");
//当有多个参数的时候在此逐一定义
Iterator employees = q.iterate();

9。order 语句
和sql语句没什么差别,如:
select employee.name from Employee as employee where employee.Name like 'J%' order by employee.ID desc (或者asc)

10。group by 语句
同样和sql语句没什么差别,如:

select employee.name,employee.DepNo from Employee as employee group by employee.DepNo

select foo.id, avg( elements(foo.names) ), max( indices(foo.names) ) from eg.Foo foo group by foo.id
{Note: You may use the elements and indices constructs inside a select clause, even on databases with no subselects.}
谁帮我解释一下上边两句,谢过!

11。子查询
hibernate同样支持子查询,写几个例子:

from eg.Cat as fatcat where fatcat.weight > ( select avg(cat.weight) from eg.DomesticCat cat )
来源:http://blog.csdn.net/zhangyu6050/archive/2004/08/16/76189.aspx
Jason   2005-04-06 21:18:20 阅读:11083  评论:3  引用:0
小圣空间 版权没有 盗版必就