Upgrading Data Schemas
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、 こちら までご連絡ください。

以前のバージョンでのアップグレードプロセスの使用

Liferay DXP 7.4 U10/Portal 7.4 GA14 以前のバージョン

モジュールのアップグレードプロセスを作成するには、以下の手順に従ってください。

  1. モジュールの bnd.bnd ファイルを開き、新しいスキーマ バージョン値を指定して Liferay-Require-SchemaVersion ヘッダーを指定します。 新しいスキーマがバージョン 1.1 であるモジュールのスキーマバージョンヘッダーの例を以下に示します。

    Liferay-Require-SchemaVersion: 1.1
    
    重要

    Liferay-Require-SchemaVersion ヘッダーが指定されていない場合、Liferay は Bundle-Version ヘッダーの値をデータベース スキーマ バージョンとみなします。

  2. モジュールの依存関係管理ファイル (Maven POM、Gradle ビルド ファイル、または Ivy ivy.xml ファイル) に、 com.liferay.portal.upgradeへの依存関係と、アップグレード プロセスに必要なその他のモジュールを追加します。 build.gradle ファイルの構成例を以下に示します。

    compile group: "com.liferay", name: "com.liferay.portal.upgrade.api", version: "2.0.3"
    
  3. UpgradeProcessベース・クラス (UpgradeStepインターフェイスを実装) を継承するUpgradeProcessクラスを作成します:

    public class MyUpgradeSchemaClass extends UpgradeProcess {
      ...
    }
    
  4. UpgradeProcess クラスの doUpgrade() メソッドをオーバーライドして、データベースを変更する手順を指定します。 SQL コマンドと SQL DDL を実行するには、それぞれ runSQL メソッドと runSQLTemplate* メソッド ( BaseDBProcess クラスから継承) を使用します。 SQLファイルからDDL文を実行してテーブルやインデックスを作成、変更、または削除する場合は、必ずANSI SQLのみを使用してください。 こうすることで、異なるデータベースでもコマンドが正しく動作することが保証されます。 ANSI 以外の SQL を使用する必要がある場合は、 UpgradeProcess クラスの runSQL または alter メソッドに記述し、文を異なるデータベースに移植できるトークンを一緒に使用するのが最善です。これは、journal-service モジュールの UpgradeSchema アップグレード ステップ クラスで runSQLTemplateString メソッドを使用して実行することで示されます。 SQL ファイルからの ANSI SQL DDL、 alter メソッド、および UpgradeProcessUpgradeProcess.AlterColumnName および UpgradeProcess.AlterColumnType 内部クラスをトークン クラスとして使用して、列名と列の型を変更します。

    public class UpgradeSchema extends UpgradeProcess {
    
      @Override
      protected void doUpgrade() throws Exception {
          String template = StringUtil.read(
              UpgradeSchema.class.getResourceAsStream("dependencies/update.sql"));
    
          runSQLTemplateString(template, false, false);
    
          upgrade(UpgradeMVCCVersion.class);
    
          alter(
              JournalArticleTable.class,
              new AlterColumnName(
                  "structureId", "DDMStructureKey VARCHAR(75) null"),
              new AlterColumnName(
                  "templateId", "DDMTemplateKey VARCHAR(75) null"),
              new AlterColumnType("description", "TEXT null"));
    
          alter(
              JournalFeedTable.class,
              new AlterColumnName("structureId", "DDMStructureKey TEXT null"),
              new AlterColumnName("templateId", "DDMTemplateKey TEXT null"),
              new AlterColumnName(
                  "rendererTemplateId", "DDMRendererTemplateKey TEXT null"),
              new AlterColumnType("targetPortletId", "VARCHAR(200) null"));
      }
    }
    

    com.liferay.calendar.service モジュールからのより簡単なアップグレード手順の例を以下に示します。 これは、 alter メソッドを使用して、カレンダー予約テーブルの列タイプを変更します。

    public class UpgradeCalendarBooking extends UpgradeProcess {
    
            @Override
            protected void doUpgrade() throws Exception {
                    alter(
                            CalendarBookingTable.class,
                            new AlterColumnType("description", "TEXT null"));
            }
    
    }
    
  5. アプリケーションが以前の従来の Liferay プラグイン アプリケーション (アプリケーション WAR) からモジュール化され、Service Builder を使用している場合は、バンドル アクティベーターを作成して登録し、Liferay の Release_ テーブルに登録します。

  6. UpgradeStepRegistratorインターフェイスを実装する、サービス型UpgradeStepRegistrator.classUpgradeStepRegistratorOSGi コンポーネント・クラスを作成します:

    package com.liferay.mycustommodule.upgrade;
    
    import com.liferay.portal.upgrade.registry.UpgradeStepRegistrator;
    
    import org.osgi.service.component.annotations.Component;
    
    @Component(immediate = true, service = UpgradeStepRegistrator.class)
    public class MyCustomModuleUpgrade implements UpgradeStepRegistrator {
    
    }
    
  7. モジュールのアップグレード登録を実装するために、registerメソッドをオーバーライドします。—あるスキーマバージョンから次のスキーマバージョンにデータベースを更新するために必要なアップグレード手順を抽象化します。 例えば、アップグレード手順レジストラクラス MyCustomModuleUpgrade (下記) は、スキーマバージョンごとに 3 つのアップグレード手順を段階的に登録します (過去と現在、 0.0.0 から 2.0.01.0.0 から 1.1.0、および 1.1.0 から 2.0.0)。

    モジュールが以前にインストールされていない場合は、最初の登録が適用されます。 これには空のアップグレード手順が 1 つだけ含まれています: 新しい DummyUpgradeStep。 この登録により、モジュールの最新のスキーマ バージョン (つまり、 2.0.0) が Liferay の Release_ テーブルに記録されます。 同じクラス名が複数のパッケージで使用される場合は、クラスに対して完全修飾クラス名を指定する必要があります。これは、1.0.0 から 1.1.0) の UpgradeFoo クラスについて以下に示すとおりです。

    package com.liferay.mycustommodule.upgrade;
    
    import com.liferay.portal.upgrade.registry.UpgradeStepRegistrator;
    
    import org.osgi.service.component.annotations.Component;
    
    @Component(immediate = true, service = UpgradeStepRegistrator.class)
    public class MyCustomModuleUpgrade implements UpgradeStepRegistrator {
    
        @Override
        public void register(Registry registry) {
            registry.register(
                "com.liferay.mycustommodule", "0.0.0", "2.0.0",
                new DummyUpgradeStep());
    
            registry.register(
                "com.liferay.mycustommodule", "1.0.0", "1.1.0",
                new com.liferay.mycustommodule.upgrade.v1_1_0.UpgradeFoo());
    
            registry.register(
                "com.liferay.mycustommodule", "1.1.0", "2.0.0",
                new com.liferay.mycustommodule.upgrade.v2_0_0.UpgradeFoo(),
                new UpgradeBar());
        }
    
    }
    
    重要

    Service Builder を使用するモジュールは、Service Builder が既にスキーマ バージョンを Liferay の Release_ テーブルに記録しているため、初期データベース スキーマ バージョンの登録を 定義すべきではありません。 ただし、Service Builder を使用しないモジュールは、 初期スキーマの登録を 定義する必要があります。

  8. アップグレード手順で OSGi サービスを使用する場合、 アップグレードはそのサービスが利用可能になるまで待機する必要があります。 レジストラ クラスが依存するクラスを宣言するには、 @Reference アノテーションを使用します。 例えば、以下の WikiServiceUpgrade レジストレータ クラスは、 SettingsFactory クラスを参照し、 UpgradePortletSettings アップグレード ステップを実行します。 setSettingsFactory メソッドの @Reference アノテーションは、レジストラ クラスが SettingsFactory サービスに依存しており、実行時環境でそのサービスが利用可能になるまで待機する必要があることを宣言しています。

    @Component(immediate = true, service = UpgradeStepRegistrator.class)
    public class WikiServiceUpgrade implements UpgradeStepRegistrator {
    
    	   @Override
    	   public void register(Registry registry) {
    	       registry.register("0.0.1", "0.0.2", new UpgradeSchema());
    
    		   registry.register("0.0.2", "0.0.3", new UpgradeKernelPackage());
    
    		   registry.register(
    			   "0.0.3", "1.0.0", new UpgradeCompanyId(),
    			   new UpgradeLastPublishDate(), new UpgradePortletPreferences(),
    			   new UpgradePortletSettings(_settingsFactory), new UpgradeWikiPage(),
    			   new UpgradeWikiPageResource());
    
    		   registry.register("1.0.0", "1.1.0", new UpgradeWikiNode());
    
    		   registry.register(
    			   "1.1.0", "1.1.1",
    			   new UpgradeDiscussionSubscriptionClassName(
    				   _subscriptionLocalService, WikiPage.class.getName(),
    				   UpgradeDiscussionSubscriptionClassName.DeletionMode.ADD_NEW));
    
    		   registry.register(
    			   "1.1.1", "2.0.0",
    			   new BaseUpgradeSQLServerDatetime(
    				   new Class<?>[] {WikiNodeTable.class, WikiPageTable.class}));
    	   }
    
    	   @Reference
    	   private SettingsFactory _settingsFactory;
    
    	   @Reference
    	   private SubscriptionLocalService _subscriptionLocalService;
    
    }
    
  9. サービスの提供を開始する前に、データベースを最新のデータベーススキーマバージョンにアップグレードしてください。 これを行うには、Bnd ヘッダー Liferay-Require-SchemaVersionService Builder サービスの最新のスキーマ バージョンに設定します。 その他のすべてのサービスについては、包含モジュールとその最新のスキーマ バージョンを対象とする @Reference アノテーションを指定します。

    ターゲットに必要な属性は以下のとおりです。

    • release.bundle.symbolic.name: モジュールのバンドルシンボル名
    • release.schema.version: モジュールの現在のスキーマバージョン

    例えば、 com.liferay.comment.page.comments.web モジュールの PageCommentsPortlet クラスは、以下の参照を定義することで、スキーマ バージョン 2.0.0 にアップグレードされます。

    @Reference(
        target = "(&(release.bundle.symbolic.name=com.liferay.comment.page.comments.web)(release.schema.version=2.0.0))"
    )
    private Release _release;
    

    OSGiサービス間の依存関係により、アップグレード参照注釈が必要となるサービスクラスの数を減らすことができます。 例えば、依存関係にあるサービスが既にアップグレードを参照している場合、そのサービスにアップグレード参照を追加する必要はありません。

    注記

    クラス VerifyProcess を使用したデータ検証は非推奨です。 検証はスキーマのバージョンと関連付けるべきである。 アップグレード プロセスはスキーマ バージョンに関連付けられていますが、 VerifyProcess インスタンスは関連付けられていません。

これで、すべてのモジュールのデータアップグレードを作成する方法がわかりました。

モジュールアップグレードライフサイクル

Liferay DXP 7.4 U44+/Portal 7.4 GA44+

サーバーが一般公開される前にすべてのアップグレードが実行されるようにするため、2つのOSGiイベントが設けられています。

public String PORTAL_INITIALIZED =
   "(module.service.lifecycle=portal.initialized)";

public String PORTLETS_INITIALIZED =
   "(module.service.lifecycle=portlets.initialized)";
  • PORTAL_INITIALIZED イベントがトリガーされると、コアアップグレードプロセスは既に実行されているはずであり、起動時にアップグレードするアプローチを使用している場合は、その時点で会社も初期化されているはずです。

  • モジュールのアップグレードは、 PORTAL_INITIALIZED が登録されたときに開始され、 PORTLETS_INITIALIZED イベントがトリガーされたときに完了する必要があります。 その後、起動時にアップグレードを行う方式の場合のみ、サーバーはリクエストを受信できるようになります。

こうすることで、Liferayはサーバーが一般公開される前にすべてのアップグレードが実行されることを保証します。

これらの OSGi イベントに依存する場合は、コンポーネントに次の参照を追加してください。 こうすれば、そのイベントがトリガーされるまで利用できなくなります。

@Reference(target = ModuleServiceLifecycle.PORTAL_INITIALIZED)
private ModuleServiceLifecycle _moduleServiceLifecycle;