让我们还是以这个经久不衰的例子"hello world"开始:)
1.message.java: 一个简单的持久类
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;
}
}
说明: id标识符 (identifier) ,它允许应用去访问数据库以一个唯一的标识,这个标识也就是持久类的主键值。如果一个message对象有两个实例,它们拥有同一个标识,那么代表他们访问的是数据库的同一个数据。在这里我们选择了long做这个标识的数据类型,但是这不是必须的。因为hibernate允许这个identifier为任何的数据类型。
2. 保存数据信息到数据库:
session session = getsessionfactory().opensession();
transaction tx = session.begintransaction();
message message = new message("hello world");
session.save(message);
tx.commit();
session.close();
在这段代码中,我们引用了hibernate的session和transaction接口。这段代码的执行,就好像我们做了下面这段sql所做的事:
insert into messages (message_id, message_text, next_message_id)
values (1, 'hello world', null)
注:这个例子中,我们假设数据中已经存在messages这张表了。
3.从数据库中读出信息并打印它们
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();
这段代码中,大家看到了“from message as m order by m.text asc”,这是hibernate自带的面向对象查询语言hibernate query language (hql).那么翻译一下这句话,就是下面这个sql了:
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
4.简单的xml映射文件
"-//hibernate/hibernate mapping dtd//en"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
name="hello.message"
table="messages">
name="id"
column="message_id">
name="text"
column="message_text"/>
name="nextmessage"
cascade="all"
column="next_message_id"/>
这个映射文件告诉hibernate,message这个类是持久化的messages这张数据库表,identifier属性对应的是表中的message_id字段,text属性对应的是message_text字段,nextmessage是一个多对一的关联,对应的是next_message_id字段。
上面这个文件可以手工编写,也可以借助第三方工具生成。
5.更新一条信息
下面让我们修改一下刚才存到数据库里面的第一条信息。
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();
这段代码等同以下三个sql语句所要实现的东西:
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
再次运行“hello world”,输入信息如下:
2 message(s) found:
greetings earthling
take me to your leader (please)
*补充,在hibernate中最核心的五个接口:
session接口:这是hibernate中一个主要的接口,session接口的建立和消毁都是轻量级并且耗费资源很少的。这一点很重要,因为在我们的应用,我们每时每刻都在做着session的create和distroy工作。它不是线程安全的,原则上它应该设计成一个时间只有一个session才对。session可以加载一个与一个工作流相关的对象,它可以监测着这个对象的变化,它被称之为持久对象的管理器,当我们要对数据对象进行编辑操作时,就要调用它了。
sessionfactory接口:我们请求一个session实例,就是从sessionfactory中取得了。当然sessionfactory就不是个轻量级的东西了,它被多个应用的线程所共享。如果你通过hibernate访问多个数据库,就要为每一个数据库建立一个sessionfactory。在hibernate的运行时,sessionfactory缓存了sql段和其它的中介映射数据。它也保持one unit of work正在读取的数据和将来可能被用到的数据。
configuration接口:configuration用于指定一个应用所使用的映射文件的地址和hibernate指定的属性文件,然后建立一个sessionfactory。
transaction接口:
query and criteria接口:
闽公网安备 35060202000074号