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 |
+---------+------------------+
ª 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),最后插入关联关系的表中数据(field和field_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
闽公网安备 35060202000074号