十一 02

22.1. 持久化类
下面的持久化类表示一个weblog和在其中张贴的一个贴子。他们是标准的父/子关系模型,但是我们会用一个有序包(ordered bag)而非集合(set)。

[codes=java]
package eg;

import java.util.List;

public class Blog {
   private Long _id;
   private String _name;
   private List _items;

   public Long getId() {
       return _id;
   }
   public List getItems() {
       return _items;
   }
   public String getName() {
       return _name;
   }
   public void setId(Long long1) {
       _id = long1;
   }
   public void setItems(List list) {
       _items = list;
   }
   public void setName(String string) {
       _name = string;
   }
}
package eg;

import java.text.DateFormat;
import java.util.Calendar;

public class BlogItem {
   private Long _id;
   private Calendar _datetime;
   private String _text;
   private String _title;
   private Blog _blog;

   public Blog getBlog() {
       return _blog;
   }
   public Calendar getDatetime() {
       return _datetime;
   }
   public Long getId() {
       return _id;
   }
   public String getText() {
       return _text;
   }
   public String getTitle() {
       return _title;
   }
   public void setBlog(Blog blog) {
       _blog = blog;
   }
   public void setDatetime(Calendar calendar) {
       _datetime = calendar;
   }
   public void setId(Long long1) {
       _id = long1;
   }
   public void setText(String string) {
       _text = string;
   }
   public void setTitle(String string) {
       _title = string;
   }
}
[/codes]
22.2. Hibernate 映射
下列的XML映射应该是很直白的。

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="eg">
   <class
       name="Blog"
       table="BLOGS" >
       
       <id
           name="id"
           column="BLOG_ID">
           
           <generator class="native"/>
           
       </id>
       
       <property
           name="name"
           column="NAME"
           not-null="true"
           unique="true"/>
           
       <bag
           name="items"
           inverse="true"
           order-by="DATE_TIME"
           cascade="all">
           
           <key column="BLOG_ID"/>
           <one-to-many class="BlogItem"/>
           
       </bag>
       
   </class>
   
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
       "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
       "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="eg">
   
   <class
       name="BlogItem"
       table="BLOG_ITEMS"
       dynamic-update="true">
       
       <id
           name="id"
           column="BLOG_ITEM_ID">
           
           <generator class="native"/>
           
       </id>
       
       <property
           name="title"
           column="TITLE"
           not-null="true"/>
           
       <property
           name="text"
           column="TEXT"
           not-null="true"/>
           
       <property
           name="datetime"
           column="DATE_TIME"
           not-null="true"/>
           
       <many-to-one
           name="blog"
           column="BLOG_ID"
           not-null="true"/>
           
   </class>
   
</hibernate-mapping>
22.3. Hibernate 代码
下面的类演示了我们可以使用Hibernate对这些类进行的一些操作。

[codes=java]
package eg;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.tool.hbm2ddl.SchemaExport;

public class BlogMain {
   
   private SessionFactory _sessions;
   
   public void configure() throws HibernateException {
       _sessions = new Configuration()
           .addClass(Blog.class)
           .addClass(BlogItem.class)
           .buildSessionFactory();
   }
   
   public void exportTables() throws HibernateException {
       Configuration cfg = new Configuration()
           .addClass(Blog.class)
           .addClass(BlogItem.class);
       new SchemaExport(cfg).create(true, true);
   }
   
   public Blog createBlog(String name) throws HibernateException {
       
       Blog blog = new Blog();
       blog.setName(name);
       blog.setItems( new ArrayList() );
       
       Session session = _sessions.openSession();
       Transaction tx = null;
       try {
           tx = session.beginTransaction();
           session.persist(blog);
           tx.commit();
       }
       catch (HibernateException he) {
           if (tx!=null) tx.rollback();
           throw he;
       }
       finally {
           session.close();
       }
       return blog;
   }
   
   public BlogItem createBlogItem(Blog blog, String title, String text)
                       throws HibernateException {
       
       BlogItem item = new BlogItem();
       item.setTitle(title);
       item.setText(text);
       item.setBlog(blog);
       item.setDatetime( Calendar.getInstance() );
       blog.getItems().add(item);
       
       Session session = _sessions.openSession();
       Transaction tx = null;
       try {
           tx = session.beginTransaction();
           session.update(blog);
           tx.commit();
       }
       catch (HibernateException he) {
           if (tx!=null) tx.rollback();
           throw he;
       }
       finally {
           session.close();
       }
       return item;
   }
   
   public BlogItem createBlogItem(Long blogid, String title, String text)
                       throws HibernateException {
       
       BlogItem item = new BlogItem();
       item.setTitle(title);
       item.setText(text);
       item.setDatetime( Calendar.getInstance() );
       
       Session session = _sessions.openSession();
       Transaction tx = null;
       try {
           tx = session.beginTransaction();
           Blog blog = (Blog) session.load(Blog.class, blogid);
           item.setBlog(blog);
           blog.getItems().add(item);
           tx.commit();
       }
       catch (HibernateException he) {
           if (tx!=null) tx.rollback();
           throw he;
       }
       finally {
           session.close();
       }
       return item;
   }
   
   public void updateBlogItem(BlogItem item, String text)
                   throws HibernateException {
       
       item.setText(text);
       
       Session session = _sessions.openSession();
       Transaction tx = null;
       try {
           tx = session.beginTransaction();
           session.update(item);
           tx.commit();
       }
       catch (HibernateException he) {
           if (tx!=null) tx.rollback();
           throw he;
       }
       finally {
           session.close();
       }
   }
   
   public void updateBlogItem(Long itemid, String text)
                   throws HibernateException {
   
       Session session = _sessions.openSession();
       Transaction tx = null;
       try {
           tx = session.beginTransaction();
           BlogItem item = (BlogItem) session.load(BlogItem.class, itemid);
           item.setText(text);
           tx.commit();
       }
       catch (HibernateException he) {
           if (tx!=null) tx.rollback();
           throw he;
       }
       finally {
           session.close();
       }
   }
   
   public List listAllBlogNamesAndItemCounts(int max)
                   throws HibernateException {
       
       Session session = _sessions.openSession();
       Transaction tx = null;
       List result = null;
       try {
           tx = session.beginTransaction();
           Query q = session.createQuery(
               "select blog.id, blog.name, count(blogItem) " +
               "from Blog as blog " +
               "left outer join blog.items as blogItem " +
               "group by blog.name, blog.id " +
               "order by max(blogItem.datetime)"
           );
           q.setMaxResults(max);
           result = q.list();
           tx.commit();
       }
       catch (HibernateException he) {
           if (tx!=null) tx.rollback();
           throw he;
       }
       finally {
           session.close();
       }
       return result;
   }
   
   public Blog getBlogAndAllItems(Long blogid)
                   throws HibernateException {
       
       Session session = _sessions.openSession();
       Transaction tx = null;
       Blog blog = null;
       try {
           tx = session.beginTransaction();
           Query q = session.createQuery(
               "from Blog as blog " +
               "left outer join fetch blog.items " +
               "where blog.id = :blogid"
           );
           q.setParameter("blogid", blogid);
           blog  = (Blog) q.uniqueResult();
           tx.commit();
       }
       catch (HibernateException he) {
           if (tx!=null) tx.rollback();
           throw he;
       }
       finally {
           session.close();
       }
       return blog;
   }
   
   public List listBlogsAndRecentItems() throws HibernateException {
       
       Session session = _sessions.openSession();
       Transaction tx = null;
       List result = null;
       try {
           tx = session.beginTransaction();
           Query q = session.createQuery(
               "from Blog as blog " +
               "inner join blog.items as blogItem " +
               "where blogItem.datetime > :minDate"
           );

           Calendar cal = Calendar.getInstance();
           cal.roll(Calendar.MONTH, false);
           q.setCalendar("minDate", cal);
           
           result = q.list();
           tx.commit();
       }
       catch (HibernateException he) {
           if (tx!=null) tx.rollback();
           throw he;
       }
       finally {
           session.close();
       }
       return result;
   }
}
[/codes]

完整PDF文档下载:
[sfile]attachment/hibernate_reference.rar[/sfile]


Tags:

作者:Jock

Leave a Reply

You must be logged in to post a comment.

Switch to our mobile site