小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

初探Liferay Enterpriese Portal的數(shù)據(jù)類型持久化

 smoking_boy 2005-09-12

前言:

最近在忙的一個項目是建立在Liferay Enterprise Portal上的,設(shè)計的幾張數(shù)據(jù)表要與已有的Portal數(shù)據(jù)庫中的User_表有級聯(lián)關(guān)系。之前從Liferay的官方網(wǎng)站上了解到LiferayPortal持久化都是通過Hibernate來實現(xiàn),故對其實現(xiàn)的方法產(chǎn)生了小小的興趣(因為我的數(shù)據(jù)表也打算通過HibernateO/R映射來實現(xiàn),代碼中難免要使用Portal的類com.liferay.portal.model.User)。

正文:

其實了解各種實現(xiàn)的方法,最好的莫過于讀源碼。(只要你有這個耐心)

我開始只想通過userId得到User對象,關(guān)于User對象的各種相關(guān)的類都在包com.liferay.portal.ejb里,你可以看到User開頭的類有一堆,呵呵,其實我們這里只要涉及幾個重要的類:

UserHBM.java 這個是User類的一個翻版,里面的信息和User里的信息基本一致(沒仔細看),Portal也是通過這個類來映射數(shù)據(jù)庫的User_表的。

UserPool.java 這個是一個與Cache相關(guān)的類,可不關(guān)心,并不影響理解。

UserManager.java 定義了與User相關(guān)的一組接口,對一些重要屬性如Group,Role等的添加刪除等。

UserManagerImpl.java 實現(xiàn)了UserManager接口,并繼承了PrincipalBean.java。

UserUtil.java 個人覺得有點象實體bean的變體,里面有create,remove,update等方法,還有一些查找方法。

UserPersistence.java 這個里面是具體數(shù)據(jù)庫的實現(xiàn)方法,UserUtil都是調(diào)用這個類的方法。

讓我們先看看UserManagerImpl.java中關(guān)于得到User的代碼,源碼第400

public User getUserById(String userId)
  throws PortalException, SystemException {

  userId = userId.trim().toLowerCase();

  User user = UserUtil.findByPrimaryKey(userId);

  if (getUserId().equals(userId) ||
   hasAdministrator(user.getCompanyId())) {

   return user;
  }
  else {
   return (User)user.getProtected();
  }
 }

然后再看UserUtil.java749

protected static com.liferay.portal.model.User findByPrimaryKey(
  java.lang.String userId)
  throws com.liferay.portal.NoSuchUserException,
   com.liferay.portal.SystemException {
  
UserPersistence persistence = (UserPersistence)InstancePool.get(PERSISTENCE);

  return persistence.findByPrimaryKey(userId);
 }

再找UserPersistence.java3026

protected com.liferay.portal.model.User findByPrimaryKey(String userId)
  throws NoSuchUserException, SystemException {
  com.liferay.portal.model.User user = UserPool.get(userId);
  Session session = null;

  try {
   if (user == null) {
    session = openSession();

    UserHBM userHBM = (UserHBM)session.load(UserHBM.class, userId);
    user = UserHBMUtil.model(userHBM);
   }

   return user;
  }
  catch (HibernateException he) {
   if (he instanceof ObjectNotFoundException) {
    throw new NoSuchUserException(userId.toString());
   }
   else {
    throw new SystemException(he);
   }
  }
  finally {
   HibernateUtil.closeSession(session);
  }
 }

看完上面這些代碼是不是就明白Portal是怎么通過userId得到User對象的?上面一段代碼中紅色的那句用過hibernate的人都會很熟悉,通過主鍵得到對象。

我們再深入一下,看一下BasePersistence.java,這個是UserPersistence.java的父類,上面代碼中openSession()在這個類里定義。

public class BasePersistence {

 protected Session openSession() throws HibernateException {
  return HibernateUtil.openSession(getHibernateConfigurationClassName());
 }

 protected Dialect getDialect() {
  return HibernateUtil.getDialect(getHibernateConfigurationClassName());
 }

 protected String getHibernateConfigurationClassName() {
  return HibernateConfiguration.class.getName();
 }

}

再看com.liferay.portal.util.HibernateUtil.java63

public static Session openSession(String className)
  throws HibernateException {

  SessionConfiguration config =
   _getSessionConfigurationInstance(className);

  return config.openSession();
 }


com.liferay.util.dao.hibernate.SessionConfiguration.java是一個抽象類,讓我直接看其子類com.liferay.portal.util.HibernateConfiguration.java

public class HibernateConfiguration extends SessionConfiguration {

 public void init() {
  try {
   ClassLoader classLoader = getClass().getClassLoader();

   Configuration cfg = new Configuration();

   String[] configs = StringUtil.split(
    SystemProperties.get("hibernate.configs"));

   for (int i = 0; i < configs.length; i++) {
    try {
     InputStream is =
      classLoader.getResourceAsStream(configs[i]);

     if (is != null) {
      cfg = cfg.addInputStream(is);

      is.close();
     }
    }
    catch (Exception e) {
     e.printStackTrace();
    }
   }

   cfg.setProperties(SystemProperties.getProperties());

   setSessionFactory(cfg.buildSessionFactory());
  }
  catch (Exception e) {
   e.printStackTrace();
  }
 }

}


上面代碼中的紅色部分是從系統(tǒng)的properties文件中讀取一些值,實際上是調(diào)用portal-ejb/system.properties文件,從這個文件的第94行就可以發(fā)現(xiàn)一些Hibernate用來做O/R mapping的文件。代碼中通過InputStream方式把這些mapping files加到Configuration中去。

大家可以去看一下這些mapping files是不是我們所熟悉的****.hbm.xml的格式?

后記:

讀了一早上的源碼,寫了一個小時的blog,無非是想切實的解決一個問題。通過讀源碼可以了解一些機制,也可以了解一些設(shè)計思想,對于每一個學習者都是有益的。從開始不知道用什么方法好,就去找admin portlet里找JSPlist-users.jsp),里面有一些相關(guān)的用戶管理的方法(User[] users = (User[])CompanyLocalManagerUtil.getUsers(company.getCompanyId()).toArray(new User[0]);),從中找到一個得到所有User的方法,也讓我聯(lián)想的去找一些相關(guān)的類,后來我就找到UserManagerUtil.java。這個過程是猜測到證實的過程,當你的猜測得到證實的時候,當你發(fā)現(xiàn)那個經(jīng)過多層包裝的你熟悉的接口方法的時候,那種感覺是快樂的,滿足的。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多