Java Persistence 関係の命名規則

ステータス:Early Access
Sean BrydonSmitha Kangath

課題

ほかの人が記述したコードは、特に大きなプロジェクトで、読みにくいことがあります。開発者が独自のスタイルを持っていて、クラス、オブジェクト、およびリソースなどの命名がその人特有であるためです。 ほかの開発者にとってはそうした開発者のコードは読みにくく、利用または保守することも難しくなります。また、どちらの選択が優れているかといった不要な議論が起き、同じチームの開発者間で不満の基になることもあります。

対処法

命名規則は、コードを読みやすくして、理解しやすくします。命名規則はまた、識別子が意図する機能に関する情報を提供します。このドキュメントでは、Java BluePrints チームがサンプルアプリケーション用に使用している命名規則について説明します。これらの命名規則は、Java EE 5 プラットフォーム内のさまざまコンポーネントおよびモジュールに関係しています。これらの命名規則を適用することで、モジュールやコンポーネントを識別および整理しやすくなります。そのため、大きなプロジェクトでも、より充実した保守を行い、調整を円滑に行うことができます。

ここで説明する規則はすべて、Java プログラミング言語のコード規則に準拠しています。

注釈には、多くのものにデフォルトがあります。たとえば、エンティティーオブジェクトをデータベース表にマッピングする場合、デフォルトでは表の名前はオブジェクトの名と同じになります。このため、Customer というエンティティー Bean がある場合、それをデータベース内の customer 表にマッピングするために、@Table(name=CUSTOMER) 注釈の name 属性を使用する必要はありません。 そのため命名規則では、コードを簡素化するために、注釈で多くのデフォルト名を使用するという事を考慮しておく必要があります。これは、認識しておくべき暗黙の名前付けがあることを意味します。注釈の命名規則では、すべてデフォルトに従うことをお勧めします。注釈にコードを記述する代わりに、デフォルトを利用します。

もう 1 つ気を付けることは、SQL および Java クエリー言語には多くの予約語があることです。それら予約語を使用するときは注意が必要です。

いくつかの識別子の種類と、それに関係する命名規則を見てみましょう。最初に、Java Persistence 仕様 (JSR 220) のサンプルに採用されている規則に従います。

識別子の種類

命名規則

例と参考資料

エンティティー (注釈は @Entity) 単にオブジェクトの名前を使用。
"Bean" または "POJO" 接尾辞を付加しない。
クラスの命名規則に従う。

例: Address.java は address エンティティーの名前。
EntityManagerFactory (注釈は @PersitenceUnit) エンティティーマネージャーファクトリが 1 つだけの場合、名前は emf

複数のエンティティーマネージャーファクトリがある場合は、規則では <persistence unit name>Emf のように名前に "Emf" を付加。

例:
public EntityManagerFactory emf;

1 つ以上の場合の例:
public EntityManagerFactory pestoreEmf;
public EntityManagerFactory inventoryWarehouseEmf;
エンティティーマネージャー (注釈は @PersistenceContext) エンティティーマネージャーが 1 つだけの場合、名前は em

複数のエンティティーマネージャーがある場合は、名前に "Em" を付加。エンティティーマネージャーが持続性ユニットと密接に関係していることがよくあるため、<持続性ユニット名>Em が一般的。

例:
private EntityManager em;


1 つ以上の場合の例:
private EntityManager pestoreEm;
private EntityManager inventoryWarehouseEm;
UserTransaction utx を使用。

例:
public UserTransaction utx;
リスナー (注釈は @EntityListeners) 規則では、エンティティー名に "Listener" を付加。
例:
OrderListener
持続性ユニット
リソース名に基づく名前。リソース名に接尾辞として "Pu" を付ける。リソース名は大文字と小文字を混在させ、各単語の先頭文字を大文字にする。
<リソース名>Pu
例 (persistence.xml ファイル内):

<persistence>
    <persistence-unit name="PetstorePu">
        <jta-data-source>jdbc/PetstoreDB</jta-data-source>
    </persistence-unit>
</persistence>

データソース名

リソース名に基づく名前。リソース名は大文字と小文字を混在させ、各単語の先頭文字を大文字にする。
jdbc/<リソース名>


例:
jdbc/PetStoreDB
O/R マッピングファイル

O/R マッピングファイルは、ソースコードで O/R マッピング注釈を無効にする場合に使用するファイル。
META_INF/persistence.xml ごとにマッピングファイルが 1 つだけ必要な場合は、デフォルト名の orm.xml を使用。

複数のマッピングファイルが必要な場合は、<リソース名>Orm.xml を使用。

例:
<persistence>
    <persistence-unit name="PetstorePu">
        <jta-data-source>jdbc/PetstoreDB</jta-data-source>
        <mapping-file>orm.xml<mapping-file>
          ...
    </persistence-unit>
</persistence>

<persistence>
    <persistence-unit name="InventoryWarehousePu">
        <jta-data-source>jdbc/OrdersDB</jta-data-source>
        <mapping-file>orderOrm.xml<mapping-file>
          ...
    </persistence-unit>
</persistence>

名前付きクエリーと検索メソッド
小文字から始めて大文字と小文字を混在させ、途中の単語の先頭文字を大文字にする。

名前付きクエリーはスコープを指定。例では、クラス名をスコープとして使用。
たとえば、次の名前付きクエリーでは "getItemsPerProductCategory" がスコープ。
@NamedQuery(
name="getItemsPerProductCategory",
query="SELECT i FROM Item i WHERE i.product.categoryId LIKE :categoryName"
)
public class MyEntity { ...

このあと、名前付きクエリーを使用するクエリーで、次のようにスコープを指定して使用。
Query query =
 em.createNamedQuery("MyEntity.getItemsPerProductCategory")
名前付きパラメータ 小文字から始めて大文字と小文字を混在させ、途中の単語の先頭文字を大文字にする。
Java クエリー言語では、クエリーに渡すことが可能な名前付きパラメータを指定できる。それら名前付きパラメータは名前付きパラメータによっても使用される。
例: パラメータ ":categoryName"
query =
 em.createQuery("
SELECT i FROM Item i WHERE i.product.categoryId LIKE :categoryName");
query = query.setParameter("
categoryName", "dogs");
データベース

データベースの命名規則がすでにある場合は、その規則に従う。そうでない場合は、アプリケーションにちなんだ名前をデータベースに付けて、DB を付加する。

<アプリケーション名>DB

例: PetStoreDB

データベース命名規則と Java 命名規則

エンティティーオブジェクトの場合、しばしば、エンティティー名とそれに関連付けられたデータベース表の名前は似たものになります。しかし、データベースの命名規則は、Java 命名規則といくらか異なります。たとえばデータベースでは、表はしばしば CUSTOMERS のように複数形になります。これに対し、オブジェクト命名規則では、マッピング先のオブジェクト名はしばしば Customer のように単数形です。この場合、Customer エンティティーのエンティティー注釈では、このマッピング情報を CUSTOMERS に置き換える必要があります。たとえば Customer エンティティーの @Table(name=CUSTOMERS) のように、各エンティティークラスは表の注釈を使用してエンティティーを表にマッピングする必要がありますが、この命名方法は一般的であるため、もう 1 つの規則とみなします。

Java Persistence では、デフォルトのマッピングが用意されています。たとえば、デフォルトでは表名はオブジェクト名と同じになります。このため、デフォルトでは、Customer エンティティーは CUSTOMER 表にマッピングされ、注釈を使用する必要はありません。オブジェクトとそれに関連付ける表を同じ名前にすると、デフォルトのマッピングを使用するだけになり、非常に便利です。Java Persistence のデフォルト命名で使いやすい機能であるため、例ではこの規則も使用します。

参考資料

次に参考資料を挙げます。

© Sun Microsystems 2006. Java BluePrints Solutions Catalog の内容はすべて著作権保護されており、サン・マイクロシステムズ社の書面による許可なしに他の著作物に発表することを禁止します。