分享
 
 
 

学习Hibernate in Action读书笔记

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

让我们还是以这个经久不衰的例子"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接口:

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有