|
前言: 最近在忙的一個項目是建立在Liferay Enterprise Portal上的,設(shè)計的幾張數(shù)據(jù)表要與已有的Portal數(shù)據(jù)庫中的User_表有級聯(lián)關(guān)系。之前從Liferay的官方網(wǎng)站上了解到Liferay的Portal持久化都是通過Hibernate來實現(xiàn),故對其實現(xiàn)的方法產(chǎn)生了小小的興趣(因為我的數(shù)據(jù)表也打算通過Hibernate的O/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) userId = userId.trim().toLowerCase(); User user = UserUtil.findByPrimaryKey(userId); if (getUserId().equals(userId) || return user;
然后再看UserUtil.java的749行
protected static com.liferay.portal.model.User findByPrimaryKey( return persistence.findByPrimaryKey(userId);
再找UserPersistence.java的3026行
protected com.liferay.portal.model.User findByPrimaryKey(String userId) try { UserHBM userHBM = (UserHBM)session.load(UserHBM.class, userId); return user;
看完上面這些代碼是不是就明白Portal是怎么通過userId得到User對象的?上面一段代碼中紅色的那句用過hibernate的人都會很熟悉,通過主鍵得到對象。 我們再深入一下,看一下BasePersistence.java,這個是UserPersistence.java的父類,上面代碼中openSession()在這個類里定義。
public class BasePersistence { protected Session openSession() throws HibernateException { protected Dialect getDialect() { protected String getHibernateConfigurationClassName() { }
再看com.liferay.portal.util.HibernateUtil.java的63行
public static Session openSession(String className) SessionConfiguration config = return config.openSession();
public class HibernateConfiguration extends SessionConfiguration { public void init() { Configuration cfg = new Configuration(); String[] configs = StringUtil.split( for (int i = 0; i < configs.length; i++) { if (is != null) { is.close(); cfg.setProperties(SystemProperties.getProperties()); setSessionFactory(cfg.buildSessionFactory()); }
大家可以去看一下這些mapping files是不是我們所熟悉的****.hbm.xml的格式?
后記: 讀了一早上的源碼,寫了一個小時的blog,無非是想切實的解決一個問題。通過讀源碼可以了解一些機制,也可以了解一些設(shè)計思想,對于每一個學習者都是有益的。從開始不知道用什么方法好,就去找admin portlet里找JSP(list-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)過多層包裝的你熟悉的接口方法的時候,那種感覺是快樂的,滿足的。 |
|
|
來自: smoking_boy > 《我的圖書館》