1. 程式人生 > >OJB中的多表查詢和更新

OJB中的多表查詢和更新

舉個例子,課程(event)和分類(catalog)二者是多對多的關係,對應關係在表catalogEventBridge中,欄位為[catalogID,eventID],現在做的是當查詢或者修改一個catalog的時候,對應的event在bridge表中也要修改

1.修改repository_user.xml



  1. <class-descriptor class="org.pie.vls.Catalog.Catalog" table="catalog"
  2. <field-descriptor name="catalogID" column="catalogID" jdbc-type="INTEGER" primarykey="true" /> 
  3.     <field-descriptor 
  4.     name="catalogName" 
  5.     column="catalogName" 
  6.     jdbc-type="VARCHAR" /> 
  7.     <collection-descriptor name="catalogEventList" 
  8.     element-class-ref="org.pie.vls.Catalog.CatalogEventBridge" 
  9.     auto-retrieve="true" 
  10.     auto-update="true" 
  11.     auto-delete="true"
  12.     <inverse-foreignkey field-ref="catalogID"
    /> 
  13.     </collection-descriptor> 
  14. </class-descriptor> 
  15. <class-descriptor class="org.pie.vls.Catalog.CatalogEventBridge" table="catalogEventBridge"
  16.     <field-descriptor 
  17.     name="catalogID" 
  18.     column="catalogID" 
  19.     jdbc-type="INTEGER"
     
  20.     primarykey="true" /> 
  21.     <field-descriptor 
  22.     name="eventTypeID" 
  23.     column="eventTypeID" 
  24.     jdbc-type="INTEGER" 
  25.     primarykey="true" /> 
  26.     </class-descriptor> 
  27.     <class-descriptor 
  28.     class="org.pie.vls.EventType.EventType" table="eventType" > 
  29.     <field-descriptor 
  30.     name="eventTypeID" 
  31.     column="eventTypeID" 
  32.     jdbc-type="INTEGER" 
  33.     primarykey="true" 
  34.     autoincrement="true" />
  35.     <field-descriptor
  36.          name="eventTypeTitle"
  37.          column="eventTypeTitle"
  38.          jdbc-type="VARCHAR"
  39.       />
  40. ... ...
  41. </class-descriptor>


2. bean檔案的定義



EventType.java


  1. public class EventType implements ,  {
  2.     private  eventTypeTitle;
  3.     private  eventTypeCode;
  4.     private  eventTypeDesc;
  5.     private int eventTypeID;
  6.     public int getEventTypeID() {
  7.         return this.eventTypeID;
  8.     }
  9.     public void setEventTypeID(int value) {
  10.         this.eventTypeID = value;
  11.     }
  12.     ... ...
  13. }


catalog.java


  1. public class Catalog implements  {
  2.     private int catalogID;
  3.     private  catalogName = "";
  4.     private List catalogEventList = new Vector();
  5.    /**
  6.      * @return Returns the catalogID.
  7.      */
  8.     public int getCatalogID() {
  9.         return catalogID;
  10.     }
  11.     /**
  12.      * @param catalogID The catalogID to set.
  13.      */
  14.     public void setCatalogID(int catalogID) {
  15.         this.catalogID = catalogID;
  16.     }
  17.     /**
  18.      * @return Returns the catalogName.
  19.      */
  20.     public  getCatalogName() {
  21.         return catalogName;
  22.     }
  23.     /**
  24.      * @param catalogName The catalogName to set.
  25.      */
  26.     public void setCatalogName( catalogName) {
  27.         this.catalogName = catalogName;
  28.     }
  29.     /**
  30.      * @return Returns the catalogEventList.
  31.      */
  32.     public List getCatalogEventList() {
  33.         return catalogEventList;
  34.     }
  35.     /**
  36.      * @param catalogEventList The catalogEventList to set.
  37.      */
  38.     public void setCatalogEventList(List catalogEventList) {
  39.         this.catalogEventList = catalogEventList;
  40.     }
  41. }


CatalogEventBridge.java


  1. public class CatalogEventBridge {
  2.     private int catalogID = 0;
  3.     private int eventTypeID = 0;
  4.     /**
  5.      * @return Returns the catalogID.
  6.      */
  7.     public int getCatalogID() {
  8.         return catalogID;
  9.     }
  10.     /**
  11.      * @param catalogID The catalogID to set.
  12.      */
  13.     public void setCatalogID(int catalogID) {
  14.         this.catalogID = catalogID;
  15.     }
  16.     /**
  17.      * @return Returns the eventTypeID.
  18.      */
  19.     public int getEventTypeID() {
  20.         return eventTypeID;
  21.     }
  22.     /**
  23.      * @param eventTypeID The eventTypeID to set.
  24.      */
  25.     public void setEventTypeID(int eventTypeID) {
  26.         this.eventTypeID = eventTypeID;
  27.     }
  28. }


3. DAO檔案


  1. import java.util.;
  2. import java.util.;
  3. import org.apache.log4j.Logger;
  4. import org.apache.ojb.broker.PersistenceBroker;
  5. import org.apache.ojb.broker.PersistenceBrokerFactory;
  6. import org.apache.ojb.broker.query.Criteria;
  7. import org.apache.ojb.broker.query.QueryByCriteria;
  8. import org.apache.ojb.broker.query.QueryFactory;
  9. import org.odmg.Implementation;
  10. import org.pie.vls.Application.AbstractVLSBase;
  11. public class CatalogDAO extends AbstractVLSBase {
  12.     private  catalogList;
  13.     private PersistenceBroker broker;
  14.     private static final Logger logger = Logger.getLogger(Catalog.class);
  15.     private int catalogID = 0;
  16.     public CatalogDAO(Implementation impl) {
  17.         super(impl);
  18.         init();
  19.     }
  20.     public CatalogDAO(Implementation impl, int catalogID) {
  21.         super(impl);
  22.         this.catalogID = catalogID;
  23.         init();
  24.     }
  25.     /* (non-Javadoc)
  26.      * @see org.pie.vls.Application.VLSBase#init()
  27.      */
  28.     public void init() {
  29.         // TODO Auto-generated method stub
  30.         try {
  31.             broker = PersistenceBrokerFactory.defaultPersistenceBroker();
  32.             broker.clearCache();
  33.             Criteria crit = new Criteria();
  34.             if (this.catalogID > 0) {
  35.                 crit.addEqualTo("catalogID"new (this.catalogID));
  36.             }
  37.             QueryByCriteria tquery = QueryFactory.newQuery(Catalog.class, crit);
  38.             this.catalogList = broker.getCollectionByQuery(tquery);
  39.             broker.clearCache();
  40.             broker.close();
  41.             logger.error(t.getMessage(), t);
  42.         }
  43.     }
  44.     public boolean isEmpty(){
  45.         return this.catalogList.isEmpty();
  46.     }
  47.     public  getCatalogList() {
  48.         return this.catalogList;
  49.     }
  50.     public Catalog getCatalog() {
  51.          iter = this.catalogList.iterator();
  52.         Catalog catalog = (Catalog) iter.next();
  53.         return catalog;
  54.     }
  55.     public void create(Catalog catalog) {
  56.         update(catalog);
  57.     }
  58.     public void update(Catalog catalog) {
  59.         try {
  60.             broker = PersistenceBrokerFactory.defaultPersistenceBroker();
  61.             broker.clearCache();
  62.             broker.beginTransaction();
  63.             broker.store(catalog);
  64.             broker.commitTransaction();
  65.             broker.close();
  66.             logger.error(t.getMessage(), t);
  67.         }
  68.     }
  69.     public void delete(Catalog catalog) {
  70.         try {
  71.             broker = PersistenceBrokerFactory.defaultPersistenceBroker();
  72.             broker.clearCache();
  73.             broker.beginTransaction();
  74.             broker.delete(catalog);
  75.             broker.commitTransaction();
  76.             broker.close();
  77.             logger.error(t.getMessage(), t);
  78.         }
  79.     }
  80. }



catalogEventBridgeDAO.java和ÍeventTypeDAO.java跟上面的DAO檔案類似,就不多說了。

使用起來就方便多了,只要例項化CatalogDAO,然後得到查詢結果,一個catalog的集合,然後通過catalog.getCatalogEventList()的方法來就得到了一個bridge的集合。
還可以通過catalogDAO的create,update和delete方法來更新catalog同時也更新catalogEventBridge表中的資料