モデル、サービス、永続レイヤーの生成
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、こちらまでご連絡ください。
バックエンドの生成
手順2/3
永続レイヤーはモデルデータの保存および取得を行います。 サービスレイヤーは、アプリケーションと永続レイヤーの間のバッファーです。サービスレイヤー内の呼び出し以外を変更することなく、永続レイヤーを異なる実装に置換できます。
ゲストブックとエントリをモデル化するには、ゲストブックとエントリモデルクラスを作成します。 ただし、Javaでこれを直接行うことはありません。 代わりに、オブジェクトモデルを生成し、Liferay DXPがサポートするすべてのSQLデータベースにそれをマップするサービスビルダーで、それらを定義します。
このアプリケーションの設計では、それぞれが異なるエントリセットを含む複数のゲストブックを使用できます。 アプリケーションにアクセスする権限を持つすべてのユーザーはエントリを追加できますが、ゲストブックを追加できるのは管理ユーザーだけになります。
それでは、始めましょう。 最初にGuestbook
エンティティを作成します。
-
guestbook-service
プロジェクトで、service.xml
を開きます。 その際、Sourceタブが選択されていることを確認してください。 -
Liferay Dev Studio DXPがプロジェクトを生成すると、このファイルはダミーのエンティティで埋められ、置き換えられます。 最初に、ファイルの開始コンテンツ(
DOCTYPE
以下)を次のコードに置き換えます。<service-builder auto-namespace-tables="true" package-path="com.liferay.docs.guestbook"><author>liferay</author> <namespace>GB</namespace> <entity name="Guestbook" local-service="true" uuid="true">
これは、作成者、名前空間、およびエンティティ名を定義しています。 名前空間は、データベースフィールド名と矛盾しないようにします。 最後のタグは、
Guestbook
エンティティ定義の開始タグです。 このタグでは、エンティティのローカルサービスを有効にし、その名前を定義して、universally unique identifier (UUID)を持つように指定します。 -
次に、PKフィールドセクションを置き換えます。
<column name="guestbookId" primary="true" type="long" />
これにより、タイプ
long
のエンティティのプライマリキーとして、guestbookId
が定義されます。 -
グループインスタンスはそのまま残しておけます。
<column name="groupId" type="long" />
これは、エンティティインスタンスが属するLiferay DXPのサイトIDを定義します(これについては後ほど説明します)。
-
監査フィールドセクションはデフォルトのままにします。 状態フィールドを追加してください。
<!-- Status fields --> <column name="status" type="int" /> <column name="statusByUserId" type="long" /> <column name="statusByUserName" type="String" /> <column name="statusDate" type="Date" />
監査セクションでは、Liferay DXPメタデータを定義します。
companyId
は、 ポータルインスタンスのプライマリキーです。userId
はユーザーのプライマリキーです。createDate
およびmodifiedDate
は、エンティティインスタンスが作成および変更されるそれぞれの日付を格納します。 状態セクションは後でワークフローを実装するために使用されます。 -
その他のフィールドセクションで、生成されたフィールドを次のフィールドに置き換えます。
<column name="name" type="String" />
-
次に、ゲストブックエンティティから他のすべてを削除します。 末尾
</entity>
タグの前に、このファインダー定義を追加します。<finder name="GroupId" return-type="Collection"> <finder-column name="groupId" /> </finder>
ファインダーは、ゲストブックエンティティを取得するために使用する
get
メソッドを生成します。 ファインダーによって使用されるフィールドは、取り出されるデータの範囲を定義します。 このファインダーは、アプリケーションが存在するサイトに対応するgroupId
で、すべてのゲストブックを取得します。 これにより、管理者はゲストブックを複数のサイトに配置でき、各Guestbook
で、そのサイトを対象とする独自のデータを持つことができます。
Guestbook
エンティティはこれで完成です。 次に、 Entry
エンティティを作成します。
-
開始エンティティタグを追加します。
<entity name="Entry" local-service="true" uuid="true">
Guestbook
エンティティと同様に、ローカルサービスを有効にし、エンティティの名前を定義して、UUIDが必要であることを指定します。 -
タグを追加して、主キーと
groupId
を定義します。<column name="entryId" primary="true" type="long" /> <column name="groupId" type="long" />
-
Guestbook
エンティティのフィールドに、一致する監査フィールドを追加します。<column name="companyId" type="long" /> <column name="userId" type="long" /> <column name="userName" type="String" /> <column name="createDate" type="Date" /> <column name="modifiedDate" type="Date" />
-
ゲストブックで行ったように、状態フィールドを追加します。
<!-- Status fields --> <column name="status" type="int" /> <column name="statusByUserId" type="long" /> <column name="statusByUserName" type="String" /> <column name="statusDate" type="Date" />
-
Entry
を定義するフィールドを追加します。<column name="name" type="String" /> <column name="email" type="String" /> <column name="message" type="String" /> <column name="guestbookId" type="long" />
name
、email
、およびmessage
フィールドは、Entry
を含みます。 これらのフィールドは、エントリ、メールアドレス、ゲストブックメッセージを作成する人の名前をそれぞれ定義します。guestbookId
は、記述するコードによって自動的に割り当てられ、Guestbook
は外部キーとなります。 これにより、Entry
が特定のGuestbook
に結び付けられます。 -
ファインダーと終了エンティティタグを追加します。
<finder name="G_G" return-type="Collection"> <finder-column name="groupId" /> <finder-column name="guestbookId" /> </finder> </entity>
ここでは、
groupId
およびguestbookId
によってゲストブックエントリを取得するファインダーを定義します。 前回と同様に、groupId
は、アプリケーションが存在するサイトに対応します。guestbookId
は、エントリの元となるゲストブックを定義します。 このファインダーは、エントリーのCollection
を戻します。 -
<entity>
タグの外側、</service-builder>
終了タグの直前に、例外タイプを定義します。EntryEmail EntryMessage EntryName GuestbookName これらは、後でtry/catchステートメントで使用する例外クラスを生成します。
-
service.xml
ファイルを保存します。
これで、Service Builderを実行して、モデル、サービス、および永続レイヤーを生成する準備が整いました。!
-
Dev Studio DXPの右側にあるGradleタスクペインで、
guestbook-service
→build
を開きます。 -
buildService
を右クリックし、Run Gradle Tasksを選択して実行します。 Gradleは最初に実行したときに依存関係をダウンロードするため、インターネットに接続していることを確認してください。 -
Project Explorerで
guestbook-service
モジュールを右クリックし、Refreshを選択します。guestbook-api
モジュールに対してこの手順を繰り返します。 これにより、Service Builderによって生成された新しいクラスとインターフェイスがDev Studio DXPに表示されます。 -
Project Explorerで
guestbook-service
モジュールを右クリックして、Gradle → Refresh Gradle Projectを選択します。guestbook-api
モジュールに対してこの手順を繰り返します。 これにより、モジュールのGradle依存関係が最新のものになります。
Service Builderは、疎結合と呼ばれる設計哲学に基づいています。 モデル、サービス、および永続レイヤーの、アプリケーションの3つのレイヤーを生成します。 疎結合とは、モデルレイヤーとサービスレイヤーでほとんどまたはまったく変更せずに、永続レイヤーを交換できるということを意味します。 モデルは-api
モジュールにあり、サービスレイヤーと永続レイヤーは-service
モジュールにあります。
各レイヤーは、Javaインターフェイスとそれらのインターフェイスの実装を使用して実装されます。 モデルを表すEntry
クラスを持つのではなく、Service BuilderはGuestbook
インターフェイス、サービスビルダーが管理するGuestbookBaseImpl
抽象クラス、およびカスタマイズ可能なGuestbookImpl
クラスを含むクラスのシステムを生成します。 この設計により、モデルをカスタマイズすることができますが、サービスビルダーは作成が面倒なコードを生成します。 これが、サービスビルダーがコードジェネレーター嫌いのコードジェネレーターである理由です。
次に、サービス実装を作成します。