﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-无聊人士-随笔分类-O/R Broker</title><link>http://www.blogjava.net/mmwy/category/4885.html</link><description>wuyu</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 13:21:57 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 13:21:57 GMT</pubDate><ttl>60</ttl><item><title> orbroker继续深入 ----  one-to-many</title><link>http://www.blogjava.net/mmwy/archive/2005/11/15/19972.html</link><dc:creator>mmwy</dc:creator><author>mmwy</author><pubDate>Tue, 15 Nov 2005 15:48:00 GMT</pubDate><guid>http://www.blogjava.net/mmwy/archive/2005/11/15/19972.html</guid><wfw:comment>http://www.blogjava.net/mmwy/comments/19972.html</wfw:comment><comments>http://www.blogjava.net/mmwy/archive/2005/11/15/19972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mmwy/comments/commentRss/19972.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mmwy/services/trackbacks/19972.html</trackback:ping><description><![CDATA[<p>在O/R Broker User Guide的“Sub queries”部分讲得非常清楚了，主要就是检索的时候定义一个sub query。<br>public class Organization {<br>&nbsp;private Integer id;<br>&nbsp;private Employee manager;<br>&nbsp;private Set employees;//子查询就做在这儿了<br>}</p>
定义result-object的时候处理一下<br>
&lt;result-object id="Organization" class="my.package.Organization"&gt;<br>
。。。。<br>
&nbsp;&lt;property name="employees"&gt;<br>
&nbsp;&nbsp;&lt;sub-query sql-statement="selectEmployeesByOrganization"&gt;<br>
&nbsp;&nbsp;&nbsp;&lt;set-parameter name="organizationId" from-column="OrganizationID"/&gt;<br>
&nbsp;&nbsp;&lt;/sub-query&gt;<br>
&nbsp;&lt;/property&gt;<br>
。。。。<br>
&lt;/result-object&gt;<img src ="http://www.blogjava.net/mmwy/aggbug/19972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mmwy/" target="_blank">mmwy</a> 2005-11-15 23:48 <a href="http://www.blogjava.net/mmwy/archive/2005/11/15/19972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> orbroker继续深入 ----  与spring结合</title><link>http://www.blogjava.net/mmwy/archive/2005/11/15/19973.html</link><dc:creator>mmwy</dc:creator><author>mmwy</author><pubDate>Tue, 15 Nov 2005 15:48:00 GMT</pubDate><guid>http://www.blogjava.net/mmwy/archive/2005/11/15/19973.html</guid><wfw:comment>http://www.blogjava.net/mmwy/comments/19973.html</wfw:comment><comments>http://www.blogjava.net/mmwy/archive/2005/11/15/19973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mmwy/comments/commentRss/19973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mmwy/services/trackbacks/19973.html</trackback:ping><description><![CDATA[<p>最初我是用spring的aop来实现spring与orbroker“结合”的，在befor的时候把orbroker和trans注进
service去，after的时候commit，如果出现exception由rollback。怎么看怎么别扭，还是 江南白衣
这个“刨虫”提醒了一下，说是spring module的cvs上有orbrokerTemplate。</p>
<p>有现成的东西，俺就不用现学木匠造轮子了，省事省心，还顺眼。</p>
<p>从spring module的cvs上下源码，把org.springmodules.orm.orbroker、org.springmodules.orm.orbroker.support两个package的东西拷进project（或者是打成jar扔进去）。</p>
<p>与ibatis、hibernate一样，java代码部分很简单，我做的测试代码就这么几行<br>public interface ResultDAO {<br>&nbsp; List find(String parentId, String catalogId);<br>}<br>public class ResultDAOORBroker extends BrokerDaoSupport implements ResultDAO {<br>&nbsp; public List find(String parentId, String catalogId) {<br>&nbsp;&nbsp;&nbsp; return this.getBrokerTemplate().selectMany("find",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new String[]{"parentId", "catalogId"},<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new String[]{parentId, catalogId});<br>&nbsp; }<br>}<br>public interface ResultManager {<br>&nbsp; List&lt;Result&gt; find(String parentId, String catalogId);<br>}</p>
<p>public class ResultManagerImpl implements ResultManager {</p>
<p>&nbsp; @SuppressWarnings("unchecked")<br>&nbsp; public List&lt;Result&gt; find(String parentId, String catalogId) {<br>&nbsp;&nbsp;&nbsp; return resultDAO.find(parentId, catalogId);<br>&nbsp; }</p>
<p>&nbsp; private ResultDAO resultDAO;<br>&nbsp; public void setResultDAO(ResultDAO resultDAO) {<br>&nbsp;&nbsp;&nbsp; this.resultDAO = resultDAO;<br>&nbsp; }<br>}<br>最主要的还是xml的配置文件，与用ibatis大体上差不了多少。</p>
<p>DataSource、TransactionManager是必须的<br>&nbsp;&nbsp;&nbsp; &lt;bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="dataSource" ref="DataSource" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br>&nbsp;&nbsp;&nbsp; &lt;bean id="DataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="driverClass" value="${marekt.jdbc.driver}" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="user" value="${marekt.jdbc.user}" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="password" value="${marekt.jdbc.password}" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="jdbcUrl" value="${marekt.jdbc.url}" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="initialPoolSize" value="2" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br>&nbsp;&nbsp;&nbsp;
&lt;bean id="PlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="locations" value="classpath:jdbc.properties" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br>然后是一个Broker的Factory<br>&nbsp;&nbsp;&nbsp; &lt;bean id="BrokerFactory" class="org.springmodules.orm.orbroker.BrokerFactoryBean"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="dataSource" ref="DataSource" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="configLocation" value="classpath:orbroker/orbroker.xml" /&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/bean&gt;</p>
剩下的事情就是DAO和Manager了。<br>
&nbsp;&nbsp;&nbsp; &lt;bean id="ResultDAO" class="dao.impl.ResultDAOORBroker"&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="broker" ref="BrokerFactory" /&gt;<br>
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br>
&nbsp;&nbsp;&nbsp; &lt;bean id="ResultManager"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="transactionManager" ref="TransactionManager" /&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="transactionAttributes"&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;props&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;prop key="*"&gt;PROPAGATION_REQUIRED&lt;/prop&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/props&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="target"&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;bean class="services.impl.ResultManagerImpl"&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&lt;property name="resultDAO" ref="ResultDAO" /&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>
&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<img src ="http://www.blogjava.net/mmwy/aggbug/19973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mmwy/" target="_blank">mmwy</a> 2005-11-15 23:48 <a href="http://www.blogjava.net/mmwy/archive/2005/11/15/19973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> orbroker继续深入 ----  one-to-one</title><link>http://www.blogjava.net/mmwy/archive/2005/11/15/19971.html</link><dc:creator>mmwy</dc:creator><author>mmwy</author><pubDate>Tue, 15 Nov 2005 15:47:00 GMT</pubDate><guid>http://www.blogjava.net/mmwy/archive/2005/11/15/19971.html</guid><wfw:comment>http://www.blogjava.net/mmwy/comments/19971.html</wfw:comment><comments>http://www.blogjava.net/mmwy/archive/2005/11/15/19971.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mmwy/comments/commentRss/19971.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mmwy/services/trackbacks/19971.html</trackback:ping><description><![CDATA[<p>已经有orbroker做过好几个小东西了，前几天在一套旧系统上做了些小花絮，实战了一把orbroker的one-to-one了。</p>
<p>表结构大致如下<br>CREATE TABLE T_INFO(<br>&nbsp;&nbsp;&nbsp; CONTENT_ID&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(50) NOT NULL,<br>&nbsp;&nbsp;&nbsp; S_TITLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(300),<br>&nbsp;&nbsp;&nbsp; S_CONTENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(4000),<br>&nbsp;&nbsp;&nbsp; S_USERNAME&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2(20),<br>&nbsp;&nbsp;&nbsp; S_USERADDRESS&nbsp; VARCHAR2(200),<br>&nbsp;&nbsp;&nbsp; S_USEREMAIL&nbsp;&nbsp;&nbsp; VARCHAR2(50),<br>&nbsp;&nbsp;&nbsp; S_USERTELPHONE VARCHAR2(20)<br>);</p>
<p>据此，我定义了两个类<br>public class Info {<br>&nbsp; private String id;<br>&nbsp; private String title;<br>&nbsp; private String content;<br>&nbsp; /**<br>&nbsp;&nbsp; * 发布者<br>&nbsp;&nbsp; */<br>&nbsp; private Publisher publisher;<br>}</p>
<p>public class Publisher {<br>&nbsp; private String name;<br>&nbsp; private String address;<br>&nbsp; private String email;<br>&nbsp; private String telphone;<br>}</p>
<p>以findByPrimeryKey这个方法为例，在orbroker.xml中做了条配置<br>&lt;sql-statement id="findByPrimeryKey" result-object="Info" external-source="/orbroker/findByPrimeryKey.sql" /&gt;<br>findByPrimeryKey.sql的内容：<br>SELECT t.content_id&nbsp;&nbsp;&nbsp;&nbsp; AS id,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.s_title&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AS title,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.s_content&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AS content,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.s_username&nbsp;&nbsp;&nbsp;&nbsp; AS userName,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.s_useraddress&nbsp; AS userAddress,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.s_useremail&nbsp;&nbsp;&nbsp; AS userEmail,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.s_usertelphone AS userTelphone<br>&nbsp; FROM t_info t<br>&nbsp;WHERE 1 = 1<br>&nbsp;&lt;#if id?exists&gt;<br>&nbsp;AND&nbsp;&nbsp; t.content_id&nbsp;&nbsp;&nbsp;&nbsp; = :id<br>&nbsp;&lt;/#if&gt;</p>
<p>one-to-one的处理，主要功夫还是在orbroker.xml定义Result-Object上面，参照orbroker user-guide中“Mapping associations”一部分，我做了这样的配置<br>&nbsp;&nbsp;&nbsp; &lt;result-object id="Info" class="domain.Info" key-columns="id"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="id"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="id" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="title"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="title" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="content"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="content" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="publisher"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;map-with result-object="Publisher" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/result-object&gt;</p>
<p>&nbsp;&nbsp;&nbsp; &lt;result-object id="Publisher" class="domain.Publisher" key-columns="id"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="name"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="userName" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="email"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="userEmail" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="address"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="userAddress" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="telphone"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="userTelphone" /&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/result-object&gt;</p>
测试通过，哈哈！<img src ="http://www.blogjava.net/mmwy/aggbug/19971.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mmwy/" target="_blank">mmwy</a> 2005-11-15 23:47 <a href="http://www.blogjava.net/mmwy/archive/2005/11/15/19971.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>