站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Hibernate 专题read-atleap-Hibernate部分分析2-CreateNews

read-atleap-Hibernate部分分析2-CreateNews

摘要: read-atleap-Hibernate部分分析2-CreateNews read-atleap-Hibernate 部分分析 2-CreateNews <!--[if !vml]-->...
read-atleap-Hibernate部分分析2-CreateNews

  read-atleap-Hibernate部分分析2-CreateNews

<!--[if !vml]-->

<!--[endif]-->

  主要的类:

ª com.blandware.atleap.persistence.hibernate.news. NewsDAOHibernate.CreateNewsItem

ª com.blandware.atleap.persistence.hibernate.news. NewsDAOHibernate. ListNewsItems

 

Ø 数据结构分析

ª NewsItem继承与Page

ª Page又继承与Localizable

 

ª Localizable.hbm.xml中的Page映射定义

            <joined-subclass

            name="com.blandware.atleap.model.core.Page"

            table="page"

            dynamic-update="false"

            dynamic-insert="false"

            lazy="false"

        >

        <key

            column="localizable_id"

        />

        <joined-subclass

            name="com.blandware.atleap.model.news.NewsItem"

            table="news_item"

            dynamic-update="false"

            dynamic-insert="false"

            lazy="false"

        >

        <key

            column="page_id"

        />

        <property

            name="publicationDate"

            type="date"

            update="true"

            insert="true"

            access="property"

            column="publication_date"

            not-null="false"

        />

        </joined-subclass>

        </joined-subclass>

ª news_item表内容

mysql> select * from news_item;

+---------+------------------+

| page_id | publication_date |

+---------+------------------+

| 47    | 2005-02-27     |

+---------+------------------+

ª page表内容

+----------------+-----------------------------------+---------------+--------+

| localizable_id | uri                    | usage_counter | active |

+----------------+-----------------------------------+---------------+--------+

|              2 | /login               |         0 | T     |

 

Ø 建立新闻业务过程分析

<!--[if !supportLists]-->I)            <!--[endif]-->newsItemId = newsManager.createNewsItem(newsItem);

 public Long createNewsItem(NewsItem newsItem) {

    //1.保持newsItem进数据库

    Long newsItemId = (Long) getHibernateTemplate().save(newsItem);

    //2.newsItem添加名为“title”的contentField

    newsItem.addContentField(fTitle) ;

getHibernateTemplate().save(fTitle);

//3.newsItem添加名为“annotation”的contentField

//4.newsItem添加名为“body”的contentField

//5.newsItem添加名为“title”的contentFieldValue

//6.newsItem添加名为“annotation”的contentFieldValue

//7.newsItem添加名为“body”的contentFieldValue

© 插入数据库时先插入父类表中的数据(localizable),在插入子类表中的数据(page

    news_item),最后插入关联关系的表中数据(fieldfield_value

执行的SQL

Hibernate: insert into localizable (version, class_name, id) values (?, ?, ?)

Hibernate: insert into page (uri, usage_counter, active, localizable_id) values

(?, ?, ?, ?)

Hibernate: insert into news_item (publication_date, page_id) values (?, ?)

Hibernate: insert into field (version, identifier, localizable_id, type, interna

l, id) values (?, ?, ?, ?, ?, ?)

Hibernate: insert into field (version, identifier, localizable_id, type, interna

l, id) values (?, ?, ?, ?, ?, ?)

Hibernate: insert into field (version, identifier, localizable_id, type, interna

l, id) values (?, ?, ?, ?, ?, ?)

Hibernate: insert into field_value (version, locale_identifier, simple_value, fi

eld_id, last_updated, id) values (?, ?, ?, ?, ?, ?)

Hibernate: insert into field_value (version, locale_identifier, value, field_id,

 last_updated, id) values (?, ?, ?, ?, ?, ?)

Hibernate: insert into field_value (version, locale_identifier, value, field_id,

 last_updated, id) values (?, ?, ?, ?, ?, ?)

Hibernate: insert into field_value (version, locale_identifier, simple_value, fi

eld_id, last_updated, id) values (?, ?, ?, ?, ?, ?)

Hibernate: insert into field_value (version, locale_identifier, value, field_id,

 last_updated, id) values (?, ?, ?, ?, ?, ?)

Hibernate: insert into field_value (version, locale_identifier, value, field_id,

 last_updated, id) values (?, ?, ?, ?, ?, ?)

<!--[if !supportLists]-->II)         <!--[endif]-->newsItem.setUri(uri);

uri="/rw/news/newsItemId"

newsManager.updateNewsItem(newsItem);

执行的SQL

Hibernate: update field_value set version=?, last_updated=? where id=? and versi

Hibernate: update localizable set version=?, class_name=? where id=? and version

=?

Hibernate: update page set uri=?, usage_counter=?, active=? where localizable_id

=?

Hibernate: update news_item set publication_date=? where page_id=?

<!--[if !supportLists]-->III)      <!--[endif]--> index news item

    SearchManager searchManager =

        SearchManager.getInstance(request.getSession().getServletContext());

searchManager.reIndexPage(newsItem, request);

 

<!--[if !supportLists]-->IV)         <!--[endif]-->return mapping.findForward("listNewsItems");

Ø 显示新闻列表

Ü      <forward

        name="listNewsItems"

        path="/news/listItems.do"

        redirect="true"

   />

 Ü   <action

      path="/news/listItems"

      type="com.blandware.atleap.webapp.action.news.ListNewsItemsAction"

      name="newsItemForm"

      scope="request"

      roles="manager"

      unknown="false"

      validate="false"

    >

      <forward

        name="listNewsItems"

        path=".news.listItems"

        redirect="false"

      />

    </action>

Ø 显示新闻列表业务过程分析

<!--[if !supportLists]-->1) <!--[endif]-->设置查询参数

<!--[if !supportLists]-->2) <!--[endif]-->从数据库中检索新闻列表

List newsItems = newsManager.listNewsItems(queryInfo).asList();

<!--[if !supportLists]-->3) <!--[endif]-->将查询得到的newsItems存入request作用域

request.setAttribute(NewsModuleWebConstants.NEWS_ITEMS_COLLECTION_KEY,

newsItems);

<!--[if !supportLists]-->4) <!--[endif]-->return mapping.findForward("listNewsItems");

    <definition name=".news.listItems" extends=".coreLayout" role="manager">

        <put name="titleKey" value="news.listItems"/>

        <put name="content" value="/WEB-INF/pages/news/listItems.jsp" />

    </definition>

© 显示新闻列表时执行的

HQL

select distinct item, title.simpleValue, annotation.value from NewsItem as item

left outer join item.contentFields as titleField left outer join item.contentFie

lds as annotationField left outer join item.contentFields as bodyField left oute

r join titleField.contentFieldValues as title left outer join annotationField.co

ntentFieldValues as annotation left outer join bodyField.contentFieldValues as b

ody left outer join item.roles as role where titleField.identifier = 'title' and

 annotationField.identifier = 'annotation' and bodyField.identifier = 'body' and

 title.contentLocale = annotation.contentLocale and title.contentLocale = body.c

ontentLocale and title.contentLocale.identifier = ?  order by item.publicationDa

te desc, title.simpleValue asc

对应SQL

 

Hibernate: select distinct newsitem0_.page_id as id, newsitem0_.publication_date

 as publicat2_11_, newsitem0__1_.uri as uri6_, newsitem0__1_.usage_counter as us

age_co3_6_, newsitem0__1_.active as active6_, newsitem0__2_.version as version0_

, newsitem0__2_.class_name as class_name0_, newsitem0_.page_id as x0_0_, content

fie4_.simple_value as x1_0_, contentfie5_.value as x2_0_ from news_item newsitem

0_ inner join page newsitem0__1_ on newsitem0_.page_id=newsitem0__1_.localizable

_id inner join localizable newsitem0__2_ on newsitem0_.page_id=newsitem0__2_.id

left outer join field contentfie1_ on newsitem0_.page_id=contentfie1_.localizabl

e_id left outer join field contentfie2_ on newsitem0_.page_id=contentfie2_.local

izable_id left outer join field contentfie3_ on newsitem0_.page_id=contentfie3_.

localizable_id left outer join field_value contentfie4_ on contentfie1_.id=conte

ntfie4_.field_id left outer join field_value contentfie5_ on contentfie2_.id=con

tentfie5_.field_id left outer join field_value contentfie6_ on contentfie3_.id=c

ontentfie6_.field_id left outer join page_role roles7_ on newsitem0_.page_id=rol

es7_.page_id left outer join role role8_ on roles7_.rolename=role8_.rolename

where (contentfie1_.identifier='title' )and(contentfie2_.identifier='annotation' )a

nd(contentfie3_.identifier='body' )and(contentfie4_.locale_identifier=contentfie

5_.locale_identifier )and(contentfie4_.locale_identifier=contentfie6_.locale_ide

ntifier )and(contentfie4_.locale_identifier=? ) order by  newsitem0_.publication

_date desc , contentfie4_.simple_value asc

 

Ø类图(附带表结构)

<!--[if !vml]-->

<!--[endif]-->

<!--[if !vml]-->

<!--[endif]-->

  © pagenews_item表没有自己的主键,都以localizable表的主键作为自己的主键,并且又以自己的主键外键关联localizable表。可以说它们是一对一的关系。

  © field表和localizable构成多对一关系,以localizable_id外键关联

  © field_value表中存放着真正的新闻内容,和field表构成多对一关系以field_id外键关联

  © 这样一来,查询一条新闻,就需要建立许多的表连接,效率堪忧。




↑返回目录
前一篇: Struts+Spring+Hibernate快速入门
后一篇: O R MAPPING(Hibernate)方法小结