服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

学习hibernate in action读书笔记


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

扫描关注微信公众号