2015-05-06 1 views
0

Я ищу для переноса данных из одной из старой базы данных в одну из таблиц Liferay. Я могу написать сценарий миграции, но мне было интересно, будет ли какая-то проблема с услугой «Counter» для liferay.Liferay переносит данные в таблицу Liferay из некоторой старой базы данных

Например, у меня есть обычная пользовательская таблица. Мне нужно переместить пользователей внутри этой таблицы в таблицу пользователя Liferay. Я могу использовать sql-скрипт для перемещения данных. Мне интересно, что происходит с первичным ключом. Насколько я знаю, Liferay имеет встречный сервис для создания первичного ключа и отслеживания текущего идентификатора.

Так что во время миграции есть что-нибудь, что мне нужно, чтобы счетчик не перепутался после миграции.

ответ

0

Есть больше проблем, чем просто счетчик. Вы должны строго использовать API Liferay для импорта содержимого.

Я мог имя несколько потенциальных проблем, чтобы обратить внимание на то, но это, вероятно, пропустить несколько больше - тем не менее, было бы, чтобы вы (или другие читаете этот ответ) уверены, что теперь они могут справиться со всеми вопросы. Вы не можете. Не иди туда. Просто используйте API, и он позаботится об обновлении всех необходимых зависимостей. Кроме того, API делает очевидным, какие другие данные вам нужны в сочетании с импортированными данными.

Любой, кто описывает более подробно, поставит вас под угрозу. И мы видели людей, которые обнаружили свои бедствия более чем через 6 месяцев после их ручной записи в базу данных (в конкретном случае с запуском в дубликаты первичных ключей, например, в частности, счетчик, который вы упоминаете). Любой из возможных сбоев может свести ваш портал с одной секунды до другой, когда вы давно забыли, что вы (или кто-то еще) вручную записали в базу данных.

+0

Спасибо за ответ. Как вы предлагаете обрабатывать транзакцию, если обновляется более одной таблицы. Если я напишу код в классе LocalServiceImpl и вызову все остальные классы LocalServiceUtil, он позаботится о транзакции или должен использовать BatchSessionUtil, что Liferay имеет –

0

Вы можете перенести данные из устаревшей базы данных с помощью интеграции данных Pentaho путем вызова конечной точки REST (определенной через {MODEL_NAME} ServiceImpl.java), которая возвращает приращение счетчика объекта, в который я хочу вставить данные. Вам просто нужно будет уважать использование одного и того же счетчика для каждого объекта, который получает новый идентификатор.

0

Вы можете петлю из списка унаследованного пользователя, и не создавать пользователь Liferay с помощью этого класса:

package com.yourcompany.yourapp.util; 

import java.util.Date; 
import java.util.List; 

import org.apache.log4j.Logger; 

import com.liferay.counter.service.CounterLocalServiceUtil; 
import com.liferay.portal.kernel.dao.orm.DynamicQuery; 
import com.liferay.portal.kernel.dao.orm.DynamicQueryFactoryUtil; 
import com.liferay.portal.kernel.dao.orm.OrderFactoryUtil; 
import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil; 
import com.liferay.portal.kernel.exception.PortalException; 
import com.liferay.portal.kernel.exception.SystemException; 
import com.liferay.portal.kernel.uuid.PortalUUIDUtil; 
import com.liferay.portal.kernel.workflow.WorkflowConstants; 
import com.liferay.portal.model.Account; 
import com.liferay.portal.model.ClassName; 
import com.liferay.portal.model.Company; 
import com.liferay.portal.model.Contact; 
import com.liferay.portal.model.Group; 
import com.liferay.portal.model.LayoutSet; 
import com.liferay.portal.model.User; 
import com.liferay.portal.security.permission.PermissionChecker; 
import com.liferay.portal.security.permission.PermissionCheckerFactoryUtil; 
import com.liferay.portal.security.permission.PermissionThreadLocal; 
import com.liferay.portal.service.AccountLocalServiceUtil; 
import com.liferay.portal.service.ClassNameLocalServiceUtil; 
import com.liferay.portal.service.CompanyLocalServiceUtil; 
import com.liferay.portal.service.ContactLocalServiceUtil; 
import com.liferay.portal.service.GroupLocalServiceUtil; 
import com.liferay.portal.service.LayoutSetLocalServiceUtil; 
import com.liferay.portal.service.RoleLocalServiceUtil; 
import com.liferay.portal.service.UserLocalServiceUtil; 
import com.liferay.portlet.asset.model.AssetEntry; 
import com.liferay.portlet.asset.service.AssetEntryLocalServiceUtil; 

public class UserUtil { 

    private static final Logger logger = Logger.getLogger(UserUtil.class); 

    private long companyId; 
    private long creatorUserId; 
    private long accountId; 
    private Date date; 

    public UserUtil() { 
     try { 
      DynamicQuery queryCompany = DynamicQueryFactoryUtil.forClass(Company.class) 
        .addOrder(OrderFactoryUtil.asc("companyId")); 
      List<Company> listCompany = (List<Company>) CompanyLocalServiceUtil.dynamicQuery(queryCompany, 0, 1); 
      companyId = listCompany.get(0).getCompanyId(); 
      //----------- 
      DynamicQuery queryAccount = DynamicQueryFactoryUtil.forClass(Account.class) 
        .addOrder(OrderFactoryUtil.asc("accountId")); 
      List<Account> listAccount = (List<Account>) AccountLocalServiceUtil.dynamicQuery(queryAccount, 0, 1); 
      accountId = listAccount.get(0).getAccountId(); 
      //----------- 
      DynamicQuery queryUser = DynamicQueryFactoryUtil.forClass(User.class) 
        .add(PropertyFactoryUtil.forName("defaultUser").eq(false)) 
        .addOrder(OrderFactoryUtil.asc("createDate")); 
      List<User> listUser = (List<User>) UserLocalServiceUtil.dynamicQuery(queryUser, 0, 1); 
      creatorUserId = listUser.get(0).getUserId(); 
      date = new Date(); 
     } catch (SystemException ex) { 
      logger.error(ex.getMessage()); 
     } 
    } 

    public void create(String screenName, String emailAddress, String hashedPassword, String fullName) { 
     try { 
      long contactId = CounterLocalServiceUtil.increment();//or use Contact.class.getName() as param 
      Contact contact = ContactLocalServiceUtil.createContact(contactId); 
      contact.setAccountId(accountId); 
      //contact.setBirthday(DateUtil.getDate("dd MM yyyy", "01 11 1986")); 
      contact.setCachedModel(true); 
      contact.setCompanyId(companyId); 
      contact.setCreateDate(date); 
      contact.setEmailAddress(emailAddress); 
      //contact.setEmployeeNumber(employeeNumber); 
      //contact.setEmployeeStatusId(employeeStatusId); 
      contact.setFirstName(fullName); 
      contact.setMale(true); 
      contact.setNew(true); 
      //contact.setUserId(creatorUserId); 
      User creatorUser = UserLocalServiceUtil.getUserById(creatorUserId); 
      contact.setUserName(creatorUser.getFullName()); 
      contact.setUserUuid(creatorUser.getUuid()); 
      ContactLocalServiceUtil.addContact(contact); 
      //---------------------- 
      long userId = CounterLocalServiceUtil.increment();//or use User.class.getName() as param 
      //---------------------- 
      User user = UserLocalServiceUtil.createUser(userId); 
      user.setAgreedToTermsOfUse(true); 
      user.setCachedModel(true); 
      user.setCompanyId(companyId); 
      user.setContactId(contactId); 
      user.setCreateDate(date); 
      user.setDefaultUser(false); 
      user.setDigest(null); 
      user.setEmailAddress(emailAddress); 
      user.setEmailAddressVerified(true); 
      user.setFirstName(fullName); 
      user.setGreeting("Hi " + user.getFirstName()); 
      user.setLanguageId("en_US"); 
      user.setModifiedDate(date); 
      user.setNew(true); 
      user.setPassword(hashedPassword); 
      user.setPasswordEncrypted(true); 
      user.setPasswordReset(false); 
      //user.setPasswordUnencrypted(); 
      user.setScreenName(screenName); 
      user.setStatus(WorkflowConstants.STATUS_APPROVED); 
      user.setTimeZoneId("UTC+7"); 
      user.setUserUuid(creatorUser.getUuid()); 
      user.setUuid(PortalUUIDUtil.generate()); 
      UserLocalServiceUtil.addUser(user); 
      //---------------------- 
      try { 
       // to avoid "PermissionChecker not Initialized" 
       PermissionChecker checker = PermissionCheckerFactoryUtil.create(creatorUser); 
       PermissionThreadLocal.setPermissionChecker(checker); 
      } catch (Exception e) { 
       logger.error(e.getMessage(), e); 
      } 
      //---------------------- 
      ClassName clsNameUser = ClassNameLocalServiceUtil.getClassName(Constants.USER_CLASS); 
      long classNameId = clsNameUser.getClassNameId(); 
      long groupId = CounterLocalServiceUtil.increment();// or use Group.class.getName() as param 
      Group group = GroupLocalServiceUtil.createGroup(groupId); 
      group.setActive(true); 
      group.setCachedModel(true); 
      group.setClassNameId(classNameId); 
      group.setClassPK(userId); 
      group.setCompanyId(companyId); 
      group.setCreatorUserId(creatorUser.getUserId()); 
      group.setCreatorUserUuid(creatorUser.getUuid()); 
      group.setFriendlyURL(String.valueOf(userId)); 
      group.setName(String.valueOf(userId)); 
      group.setNew(true); 
      group.setSite(false); 
      group.setTreePath("/" + groupId + "/"); 
      group.setType(0); 
      group.setUuid(PortalUUIDUtil.generate()); 
      GroupLocalServiceUtil.addGroup(group); 
      //----------------------------- 
      long layoutSetId1 = CounterLocalServiceUtil.increment();//or use LayoutSet.class.getName() as param 
      LayoutSet layoutSet1 = LayoutSetLocalServiceUtil.createLayoutSet(layoutSetId1); 
      layoutSet1.setCachedModel(true); 
      //layoutSet.setColorSchemeId(colorSchemeId); 
      layoutSet1.setCompanyId(companyId); 
      layoutSet1.setCreateDate(date); 
      //layoutSet.setCss(css); 
      layoutSet1.setGroupId(groupId); 
      //layoutSet.setLogo(logo); 
      //layoutSet.setLogoId(logoId); 
      layoutSet1.setModifiedDate(date); 
      layoutSet1.setNew(true); 
      layoutSet1.setPrivateLayout(true); 
      //layoutSet.setThemeId(themeId); 
      LayoutSetLocalServiceUtil.addLayoutSet(layoutSet1); 
      //----------------------------- 
      long layoutSetId2 = CounterLocalServiceUtil.increment();// or use LayoutSet.class.getName() as param 
      LayoutSet layoutSet2 = LayoutSetLocalServiceUtil.getLayoutSet(layoutSetId1); 
      layoutSet2.setLayoutSetId(layoutSetId2); 
      layoutSet2.setPrivateLayout(false); 
      LayoutSetLocalServiceUtil.addLayoutSet(layoutSet2); 
      //----------------------------- 
      long assetEntryId = CounterLocalServiceUtil.increment();//or use AssetEntry.class.getName() as param 
      AssetEntry assetEntry = AssetEntryLocalServiceUtil.createAssetEntry(assetEntryId); 
      assetEntry.setCompanyId(companyId); 
      assetEntry.setClassPK(userId); 
      assetEntry.setGroupId(groupId); 
      assetEntry.setClassNameId(classNameId); 
      //ae.setTitle(title); 
      assetEntry.setUserId(userId); 
      AssetEntryLocalServiceUtil.addAssetEntry(assetEntry); 
      //-------------------------------------------------- 
      //long orgAdminRoleId = RoleLocalServiceUtil.getRole(companyId, Constants.ORG_ADMIN_ROLE_NAME).getRoleId(); 
      //UserGroupRoleLocalServiceUtil.addUserGroupRoles(userId, groupId, new long[] { orgAdminRoleId }); 
      long orgUserRoleId = RoleLocalServiceUtil.getRole(companyId, Constants.ORG_USER_ROLE_NAME).getRoleId(); 
      RoleLocalServiceUtil.addUserRole(userId, orgUserRoleId); 
      long siteMemberRoleId = RoleLocalServiceUtil.getRole(companyId, Constants.SITE_MEMBER_ROLE_NAME).getRoleId(); 
      RoleLocalServiceUtil.addUserRole(userId, siteMemberRoleId); 
      //----------------------------------------------------------- 
     } catch (SystemException | PortalException ex) { 
      logger.error(ex.getMessage(), ex); 
     } 
    } 
} 

, то вы можете создать новый экземпляр UserUtil и способ вызова create() внутри вашей петли списка пользователей унаследованного, что-то вроде этого:

UserUtil userUtil = new UserUtil(); 
for (LegacyUser user : listOfLegacyUser) { 
    userUtil.create(........); 
} 

обратите внимание, что hashedPassword зависит от того, что ваш метод хеширования, определяется в portal-ext.properties, значение по умолчанию: passwords.ecnryption.algorithm=PBKDF2WithHmacSHA1/160/128000 , но вы можете использовать одно из значений ниже:

passwords.encryption.algorithm=BCRYPT/10 
passwords.encryption.algorithm=MD2 
passwords.encryption.algorithm=MD5 
passwords.encryption.algorithm=NONE 
passwords.encryption.algorithm=PBKDF2WithHmacSHA1/160/128000 
passwords.encryption.algorithm=SHA 
passwords.encryption.algorithm=SHA-256 
passwords.encryption.algorithm=SHA-384 
passwords.encryption.algorithm=SSHA 
passwords.encryption.algorithm=UFC-CRYPT 
Смежные вопросы