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() メソッドを、データベースを変更するための指示でオーバーライドします。 runSQL メソッドと runSQLTemplate* メソッド ( BaseDBProcess クラスから継承) を使用して、それぞれ SQL コマンドと SQL DDL を実行します。 SQL ファイルから DDL 文を実行してテーブルまたはインデックスを作成、変更、または削除する場合は、必ず ANSI SQL のみを使用してください。 これを行うと、コマンドが異なるデータベースで機能することが保証されます。 ANSI 以外の SQL を使用する必要がある場合は、それを UpgradeProcess クラスの runSQL または alter メソッドに記述し、文を異なるデータベースに移植できるようにするトークンを付けることをお勧めします。これは、以下の journal-service モジュールの UpgradeSchema アップグレード ステップ クラスで示されており、このクラスでは runSQLTemplateString メソッドを使用して SQL ファイルから ANSI SQL DDL を実行し、 alter メソッドと UpgradeProcessUpgradeProcess.AlterColumnNameUpgradeProcess.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 を使用している場合は、 Bundle Activator を作成して登録し 、Liferay の Release_ テーブルに登録します。

  6. UpgradeStepRegistrator サービス タイプ UpgradeStepRegistrator.class の OSGi コンポーネント クラスを作成し、 UpgradeStepRegistrator インターフェイスを実装します。

    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. レジスタ メソッドをオーバーライドして、データベースをあるスキーマ バージョンから次のバージョンに更新するために必要なアップグレード手順に対するモジュールのアップグレード登録—抽象化を実装します。 たとえば、アップグレード ステップ レジストラ クラス MyCustomModuleUpgrade (下記) は、スキーマ バージョンごとに 3 つのアップグレード ステップを増分登録します (過去と現在、 0.0.0 から 2.0.01.0.0 から 1.1.01.1.0 から 2.0.0)。

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

    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 レジストレータ クラスは、 UpgradePortletSettings アップグレード ステップの SettingsFactory クラスを参照します。 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;