Liferay переносит данные в таблицу Liferay из какой-то устаревшей базы данных

Я хочу перенести данные из одной из устаревших баз данных в одну из таблиц Liferay. Я могу написать скрипт миграции, но мне было интересно, не будет ли проблем со службой «Счетчик» liferay.

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

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


person Sandeep Nair    schedule 06.05.2015    source источник


Ответы (3)


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

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

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

person Olaf Kock    schedule 07.05.2015
comment
Спасибо за ответ. Как вы предлагаете обрабатывать транзакцию, если нужно обновить более одной таблицы. Если я напишу код в классе LocalServiceImpl и вызову все остальные классы LocalServiceUtil, позаботится ли он о транзакции или мне следует использовать BatchSessionUtil, который есть у Liferay? - person Sandeep Nair; 12.05.2015

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

person elabx    schedule 20.10.2016

Вы можете выполнить цикл из списка устаревших пользователей и создать пользователей 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
person danisupr4    schedule 31.10.2016