0

レガシー データベースの 1 つから Liferay テーブルの 1 つにデータを移行しようとしています。移行スクリプトを書くことはできますが、liferay の「Counter」サービスに何か問題があるのではないかと考えていました。

たとえば、従来のカスタム ユーザー テーブルがあります。このテーブル内のユーザーを Liferay の User_ テーブルに移動する必要があります。SQLスクリプトを使用してデータを移動できます。主キーで何が起こるのか疑問に思っています。私の知る限り、Liferay には主キーを作成して現在の ID を追跡するカウンター サービスがあります。

したがって、移行中に、移行後にカウンターが台無しにならないようにする必要があることはあります。

4

3 に答える 3

0

カウンターだけでなく、より多くの問題があります。コンテンツをインポートするには、Liferay の API を厳密に使用する必要があります。

注意を払うべき潜在的な問題をいくつか挙げることができますが、これはおそらくさらにいくつか見逃すでしょう-しかし、あなた(またはこの回答を読んでいる他の人)は、すべての問題に対処できると確信できます. できません。そこに行かないでください。API を使用するだけで、必要な依存関係がすべて更新されます。さらに、API は、インポートしたデータと組み合わせて必要な他のデータを明らかにします。

詳細に説明する人は誰でも、あなたを惨事に陥らせるでしょう. また、手動でデータベースに書き込んでから 6 か月以上経過してから災害を発見した人もいます (特定のケースでは、主キーが重複している場合、具体的にはあなたが言及したカウンターなど)。自分 (または他の誰か) が手動でデータベースに書き込んだことを長い間忘れていた場合、考えられる障害のいずれかによって、ポータルが秒単位でダウンする可能性があります。

于 2015-05-07T08:58:09.853 に答える
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
于 2016-10-31T16:11:50.273 に答える
0

データを挿入したいエンティティのカウンター増分を返す REST エンドポイント ({MODEL_NAME}ServiceImpl.java で定義) を呼び出すことで、Pentaho Data Integration を使用してレガシー データベースからデータを移行できます。新しい ID を取得するエンティティごとに同じカウンターを使用することを尊重する必要があります。

于 2016-10-20T05:07:00.457 に答える