<?xml version="1.0" encoding="UTF-8"?>
<document>
	<properties>
		<title>S2JDBC - エンティティ</title>
	</properties>
	<body>
		<section name="エンティティ">
			<p></p>
			<ul>
				<li>
					<a href="#概要">概要</a>
				</li>
				<li>
					<a href="#エンティティ定義">エンティティ定義</a>
					<ul>
						<li>
							<a href="#テーブル定義">テーブル定義</a>
						</li>
						<li>
							<a href="#継承">継承</a>
						</li>
					</ul>
				</li>
				<li>
					<a href="#プロパティ定義">プロパティ定義</a>
					<ul>
						<li>
							<a href="#永続プロパティの型">永続プロパティの型</a>
						</li>
						<li>
							<a href="#カラム定義">カラム定義</a>
						</li>
						<li>
							<a href="#識別子定義">識別子定義</a>
						</li>
						<li>
							<a href="#バージョン定義">バージョン定義</a>
						</li>
						<li>
							<a href="#列挙定義">列挙定義</a>
						</li>
						<li>
							<a href="#時制定義">時制定義</a>
						</li>
						<li>
							<a href="#ラージオブジェクト定義">ラージオブジェクト定義</a>
						</li>
						<li>
							<a href="#フェッチ対象外定義">フェッチ対象外定義</a>
						</li>
						<li>
							<a href="#永続化対象外定義">永続化対象外定義</a>
						</li>
					</ul>
				</li>
				<li>
					<a href="#関連定義">関連定義</a>
					<ul>
						<li>
							<a href="#多対一関連定義">多対一関連定義</a>
						</li>
						<li>
							<a href="#一対多関連定義">一対多関連定義</a>
						</li>
						<li>
							<a href="#一対一関連定義">一対一関連定義</a>
						</li>
						<li>
							<a href="#結合カラム定義">結合カラム定義</a>
						</li>
					</ul>
				</li>
			</ul>
		</section>

		<section name="概要">
			<p> エンティティの定義の仕方を説明します。ここでいっているエンティティとは、 データベースに永続化されるものだと考えてください。
			</p>
			<div class="caution">
				<div>注意点</div>
				<p>
					エンティティ用のアノテーションは、JPAのものをそのまま利用していますが、
					すべてのアノテーションや要素をサポートしているわけではありません。
					ここに取り上げられているもののみサポートされているとお考えください。
				</p>
			</div>
		</section>

		<section name="エンティティ定義">
			<p>
				エンティティにするためには、
				<code>@Entity</code>
				を必ず指定する必要があります。
			</p>
			<source><![CDATA[@Entity
public class Employee {
    ...
}
]]></source>
			<p>
				<code>name</code>
				要素でエンティティ名を指定することができます。
				次の例では、
				<code>Emp</code>
				というエンティティ名を指定しています。
			</p>
			<source><![CDATA[@Entity(name = "Emp")
public class Employee {
    ...
}]]></source>
			<p>
				<code>name</code>
				要素を指定しなかった場合、エンティティのクラス名からパッケージ名を除いた部分が、
				デフォルトのエンティティ名になります。例えば、クラス名が
				<code>examples.entity.Employee</code>
				の場合、デフォルトのエンティティ名は、
				<code>Employee</code>
				になります。
			</p>

			<subsection name="テーブル定義">
				<p>
					テーブル情報を指定するには、
					<code>@Table</code>
					を使います。
				</p>
				<p>
					<code>name</code>
					要素でテーブル名を指定することができます。
					指定しなかった場合、テーブル名はエンティティ名と同じになります。エンティティ名が、
					<code>AaaBbb</code>
					のようなキャメル記法の場合、テーブル名は、
					<code>AAA_BBB</code>
					のように
					<code>'_'</code>
					区切りだとみなされます。
				</p>
				<p>
					このルールは、
					<code>convention.dicon</code>
					で指定されている
					<code>
						org.seasar.framework.convention.impl.PersistenceNamingConventionImpl
					</code>
					の
					<code>fromEntityNameToTableName()</code>
					の実装を変えることで、カスタマイズすることができます。
				</p>
				<p>
					次の例では、
					<code>EMP</code>
					というテーブル名を指定しています。
				</p>
				<source><![CDATA[@Entity
@Table(name = "EMP")
public class Employee {
    ...
}]]></source>
				<p>
					<code>schema</code>
					要素でスキーマを指定することができます。
					指定した場合、自動生成されるSQLのテーブル名がスキーマ.テーブル名になります。
				</p>
				<p>
					<code>catalog</code>
					要素でカタログを指定することができます。
					指定した場合、自動生成されるSQLのテーブル名がカタログ.テーブル名になります。
					<code>catalog</code>
					要素と
					<code>schema</code>
					要素の両方を指定した場合、自動生成されるSQLのテーブル名はカタログ.スキーマ.テーブル名になります。
				</p>
			</subsection>

			<subsection name="継承">
				<p>
					エンティティは
					<code>@MappedSuperclass</code>
					が指定されたクラスを継承できます。
				</p>
				<source><![CDATA[@MappedSuperclass
public abstract class AbstractEmployee {
    ...
}]]></source>
				<source><![CDATA[@Entity
public class Employee extends AbstractEmployee {
    ...
}]]></source>
				<p>
					<code>@MappedSuperclass</code>
					には、エンティティと同じように永続プロパティを定義できます。
					定義された永続プロパティは、サブクラスの永続プロパティとみなされます。
					スーパークラスとサブクラスでインスタンスフィールドの名前が重複しないように定義してください。
				</p>
				<p>
					エンティティは
					<code>@MappedSuperclass</code>
					が指定されていないクラスも継承できます。
					しかし、この場合、スーパークラスのプロパティはサブクラスの永続プロパティとみなされません。
				</p>
				<p>
					エンティティが他のエンティティを継承することはサポートされていません。
				</p>
			</subsection>
		</section>

		<section name="プロパティ定義">
			<subsection name="永続プロパティの型">
				<p>
					<a href="#関連定義">関連</a>
					および
					<a href="#永続化対象外定義">永続化対象外</a>
					を除いたプロパティとして利用可能な型は次のとおりです。
				</p>
				<dl>
					<dt>プリミティブ型</dt>
					<dd>
						<ul>
							<li>
								<code>boolean</code>
							</li>
							<li>
								<code>char</code>
							</li>
							<li>
								<code>byte</code>
							</li>
							<li>
								<code>short</code>
							</li>
							<li>
								<code>int</code>
							</li>
							<li>
								<code>long</code>
							</li>
							<li>
								<code>float</code>
							</li>
							<li>
								<code>double</code>
							</li>
						</ul>
					</dd>
					<dt>ラッパー型</dt>
					<dd>
						<ul>
							<li>
								<code>Boolean</code>
							</li>
							<li>
								<code>Character</code>
							</li>
							<li>
								<code>Byte</code>
							</li>
							<li>
								<code>Short</code>
							</li>
							<li>
								<code>Integer</code>
							</li>
							<li>
								<code>Long</code>
							</li>
							<li>
								<code>Float</code>
							</li>
							<li>
								<code>Double</code>
							</li>
						</ul>
					</dd>
					<dt>文字列型</dt>
					<dd>
						<ul>
							<li>
								<code>java.lang.String</code>
							</li>
						</ul>
						<p>
							※
							<a href="#ラージオブジェクト定義">ラージオブジェクト</a>
							にすることができます。
						</p>
					</dd>
					<dt>数値型</dt>
					<dd>
						<ul>
							<li>
								<code>java.math.BigDecimal</code>
							</li>
							<li>
								<code>java.math.BigInteger</code>
							</li>
						</ul>
					</dd>
					<dt>列挙型</dt>
					<dd>
						<ul>
							<li>
								<code>java.lang.Enumのサブクラス</code>
							</li>
						</ul>
					</dd>
					<dt>日付・時刻型</dt>
					<dd>
						<ul>
							<li>
								<code>java.util.Date</code>
							</li>
							<li>
								<code>java.util.Calendar</code>
							</li>
							<li>
								<code>java.sql.Date</code>
							</li>
							<li>
								<code>java.sql.Time</code>
							</li>
							<li>
								<code>java.sql.Timestamp</code>
							</li>
						</ul>
						<p>
							※
							<code>java.util.Date</code>
							および
							<code>java.util.Calendar</code>
							型のプロパティには
							<a href="#時制定義">時制</a>
							の指定が必須です．
						</p>
					</dd>
					<dt>バイト列型</dt>
					<dd>
						<ul>
							<li>
								<code>byte[]</code>
							</li>
						</ul>
						<p>
							※
							<a href="#ラージオブジェクト定義">ラージオブジェクト</a>
							にすることができます。
						</p>
					</dd>
					<dt>シリアライズ可能型</dt>
					<dd>
						<ul>
							<li>
								<code>java.io.Serializable</code>
							</li>
						</ul>
						<p>
							※
							<a href="#ラージオブジェクト定義">ラージオブジェクト</a>
							にすることができます。
						</p>
					</dd>
				</dl>
			</subsection>

			<subsection name="カラム定義">
				<p>
					カラム情報を指定するには、
					<code>@Column</code>
					を使います。
				</p>
				<p>
					<code>name</code>
					要素でカラム名を指定することができます。
					指定しなかった場合、カラム名はフィールド名と同じになります。フィールド名が、
					<code>aaaBbb</code>
					のようなキャメル記法の場合、カラム名は、
					<code>AAA_BBB</code>
					のように
					<code>'_'</code>
					区切りだとみなされます。
				</p>
				<p>
					このルールは、
					<code>convention.dicon</code>
					で指定されている
					<code>
						org.seasar.framework.convention.impl.PersistenceNamingConventionImpl
					</code>
					の
					<code>fromPropertyNameToColumnName()</code>
					の実装を変えることで、カスタマイズすることができます。
				</p>
				<p>
					デフォルトでは、プロパティ名とフィールド名は同じになりますが、
					<code>convention.dicon</code>
					で指定されている
					<code>
						org.seasar.framework.convention.impl.PersistenceNamingConventionImpl
					</code>
					の
					<code>fromFieldNameToPropertyName()</code>
					の実装を変えることで、カスタマイズすることができます。
				</p>
				<p>
					次の例では、
					<code>AB1234</code>
					というカラム名を指定しています。
				</p>
				<source><![CDATA[
@Column(name = "AB1234")
public String shortName;
]]></source>
				<p>
					<code>insertable</code>
					要素で挿入可能かどうかを指定することができます。デフォルトは
					<code>true</code>
					です。
					<code>false</code>
					の場合、挿入用のSQLにこのカラムは含まれません。
					カラムにデフォルト値を適用したい場合は、
					<code>false</code>
					にすると良いでしょう。
				</p>
				<p>
					<code>updatable</code>
					要素で更新可能かどうかを指定することができます。デフォルトは
					<code>true</code>
					です。
					<code>false</code>
					の場合、更新用のSQLにこのカラムは含まれません。
					カラムにデフォルト値を適用したい場合は、
					<code>false</code>
					にすると良いでしょう。
				</p>
			</subsection>

			<subsection name="識別子定義">
				<p>
					識別子(主キー)であることを指定するには、
					<code>@Id</code>
					を使います。
				</p>
				<source><![CDATA[
@Id
public Integer id;
]]></source>
				<p>
					複合主キーの場合は、
					<code>@Id</code>
					を複数つけます。
				</p>
				<source><![CDATA[
@Id
public Integer id;

@Id
public Integer id2;
]]></source>
				<p>
					識別子は、アプリケーション側で生成することもできますが、 Seasar2に自動生成させることもできます。
					自動生成させるには、
					<code>@GeneratedValue</code>
					を使います。
				</p>
				<p>
					自動生成のタイプは、
					<code>@GeneratedValue</code>
					の
					<code>strategy</code>
					要素で指定します。指定できるタイプのは次の4つです。
				</p>
				<dl>
					<dt>
						<code>GenerationType.TABLE</code>
					</dt>
					<dd>テーブルを使います。</dd>
					<dt>
						<code>GenerationType.SEQUENCE</code>
					</dt>
					<dd>シーケンスを使います。</dd>
					<dt>
						<code>GenerationType.IDENTITY</code>
					</dt>
					<dd>データベース固有の識別子自動生成を使います。</dd>
					<dt>
						<code>GenerationType.AUTO</code>
						(デフォルト)
					</dt>
					<dd>
						データベースに応じて
						<code>TABLE・SEQUENCE・IDENTITY</code>
						のいずれかが選択されます。
						<code>IDENTITY</code>
						が使える場合は
						<code>IDENTITY</code>
						に、
						<code>IDENTITY</code>
						が使えなくて
						<code>SEQUENCE</code>
						が使える場合は
						<code>SEQUENCE</code>
						に、
						<code>IDENTITY</code>
						も
						<code>SEQUENCE</code>
						も使えない場合は
						<code>TABLE</code>
						になります。
					</dd>
				</dl>
				<h4>
					<code>GenerationType.TABLE</code>
				</h4>
				<p>
					<code>GenerationType.TABLE</code>
					は次のようにして使います。
				</p>
				<source><![CDATA[
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
public Integer id;
]]></source>
				<p>
					上記のように指定した場合、あらかじめ、次のようなテーブルとデータを用意しておく必要があります。
				</p>
				<source><![CDATA[
create table ID_GENERATOR (
  PK varchar(80) not null primary key,
  VALUE integer);
]]></source>
				<source><![CDATA[
insert into ID_GENERATOR (PK, VALUE) values ('EMPLOYEE_ID', 1);
]]></source>
				<p>
					<code>ID_GENERATOR</code>
					テーブルのPKカラムには、
					<code>&lt;テーブル名&gt;_&lt;識別子のカラム名&gt;</code>
					を設定します。
				</p>
				<p>
					テーブル名やカラム名をカスタマイズするには、次のように
					<code>@TableGenerator</code>
					アノテーションで指定します。
				</p>
				<source><![CDATA[
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "EMPLOYEE_GEN")
@TableGenerator(
    name = "EMPLOYEE_GEN",
    table = "ID_GEN",
    pkColumnName = "GEN_NAME",
    valueColumnName = "GEN_VALUE")
public Integer id;
]]></source>
				<p>
					上記のような
					<code>TableGenerator</code>
					を定義した場合、あらかじめ、次のようなテーブルとデータを用意しておく必要があります。
				</p>
				<source><![CDATA[
create table ID_GEN (
  GEN_NAME varchar(80) not null primary key,
  GEN_VALUE integer);
]]></source>
				<source><![CDATA[
insert into ID_GEN (GEN_NAME, GEN_VALUE) values ('EMPLOYEE_GEN', 1);
]]></source>

				<h4>
					<code>GenerationType.SEQUENCE</code>
				</h4>
				<p>
					<code>GenerationType.SEQUENCE</code>
					は次のようにして使います。
				</p>
				<source><![CDATA[
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
public Integer id;
]]></source>
				<p>上記のように指定した場合、あらかじめ、次のようなシーケンスを用意しておく必要があります。</p>
				<source><![CDATA[
create sequence EMPLOYEE_ID
  incremet by 50;
]]></source>
				<p>
					シーケンス名は、
					<code>&lt;テーブル名&gt;_&lt;識別子のカラム名&gt;</code>
					となります。
				</p>
				<p>
					シーケンス名をカスタマイズするには、次のように
					<code>@SequenceGenerator</code>
					アノテーションで指定します。
				</p>
				<source><![CDATA[
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "EMPLOYEE_GEN")
@SequenceGenerator(
    name = "EMPLOYEE_GEN",
    sequenceName = "EMPLOYEE_SEQ")
public Integer id;
]]></source>
				<p>
					上記のような
					<code>SequenceGenerator</code>
					を定義した場合、
					あらかじめ、次のようなシーケンスを用意しておく必要があります。
				</p>
				<source><![CDATA[
create sequence EMPLOYEE_SEQ
  incremet by 50;
]]></source>

				<h4>
					<code>GenerationType.IDENTITY</code>
				</h4>
				<p>
					<code>GenerationType.IDENTITY</code>
					は次のようにして使います。
				</p>
				<source><![CDATA[
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Integer id;
]]></source>
				<p>
					<code>GenerationType.IDENTITY
					</code>を使う場合、識別子はデータベース固有の方法を使って自動生成されるようにしてください。
				</p>
				<source><![CDATA[
create table Employee {
  ID integer not null primary key generated always as identity,
  ...);
]]></source>
			</subsection>

			<subsection name="バージョン定義">
				<p>
					バージョンチェック用であることを指定するには、
					<code>@Version</code>
					を使います。更新時に、エンティティの値とカラムの値が同一かどうかをチェックし、
					同一ならカラムの値がインクリメントされて更新されます。同一でない場合、
					<code>
						javax.persistence.OptimisticLockException
					</code>
					が発生します。
				</p>
				<p>
					例えば、エンティティのバージョンチェック用のプロパティの値が1だったとします。
					更新時にカラムの値が1のままならOKで、2に更新されます。
					カラムの値が1でない場合は、他で更新されているということなので、
					<code>
						javax.persistence.OptimisticLockException
					</code>
					が発生します。
				</p>
				<source><![CDATA[
@Version
public Long version = 0L;
]]></source>
				<div class="caution">
					<div>注意点</div>
					<p>
						@Versionアノテーションは数値型のフィールドにのみ指定することができます。JPA仕様ではTimestamp型のフィールドもバージョンチェックに使用できることになっていますが、S2JDBCではサポートしていません。更新時刻の保持と排他制御は目的が違うので別のフィールドにしてください。
					</p>
				</div>
			</subsection>

			<subsection name="列挙定義">
				<p>
					<code>java.lang.Enum</code>
					のサブクラスは，デフォルトでは列挙定数の序数 (
					<code>Enum#ordinal()</code>
					の戻り値) で扱われます．
					列挙の扱いを変更するには、
					<code>@Enumerated</code>
					を指定します。
					<code>@Enumerated</code>
					で指定可能な値は次のとおりです。
				</p>
				<dl>
					<dt>
						<code>EnumType.ORDINAL</code>
					</dt>
					<dd>
						列挙定数の序数 (
						<code>Enum#ordinal()</code>
						の戻り値) で扱うことを指定します (デフォルト)。
					</dd>
					<dt>
						<code>EnumType.STRING</code>
					</dt>
					<dd>
						列挙定数の名前 (
						<code>Enum#name()</code>
						の戻り値) で扱うことを指定します。
					</dd>
				</dl>
				<source><![CDATA[
public JobType jobType; //序数で扱われます

@Enumerated
public JobType jobType; //序数で扱われます

@Enumerated(EnumType.ORDINAL)
public JobType jobType; //序数で扱われます

@Enumerated(EnumType.STRING)
public JobType jobType; //名前で扱われます
]]></source>
				<div class="caution">
					<div>注意点</div>
					<p>
						Seasar2.4.26までは、
						<code>@Enumerated</code>
						はサポートされておらず、列挙は名前で扱われていました。
						Seasra2.4.27以降で2.4.26以前と同じように
						<code>@Enumerated</code>
						の指定されていない列挙を名前で扱うには、
						<code>s2jdbc.dicon</code>
						に次のように記述をしてください。
					</p>
				</div>
				<source><![CDATA[
<component name="jdbcManager" class="org.seasar.extension.jdbc.manager.JdbcManagerImpl">
    ・・・
    <!-- 以下を追加 -->
    <initMethod>
        @org.seasar.extension.jdbc.types.ValueTypes@setEnumDefaultValueType(
            @org.seasar.extension.jdbc.types.EnumType@class)
    </initMethod>
</component>
]]></source>
			</subsection>

			<subsection name="時制定義">
				<p>
					<code>java.util.Date</code>
					および
					<code>java.util.Calendar</code>
					型のプロパティには時制を指定します。 時制を指定するには、
					<code>@Temporal</code>
					を使います。
					<code>@Temporal</code>
					で指定可能な値は次のとおりです。
				</p>
				<dl>
					<dt>
						<code>TemporalType.DATE</code>
					</dt>
					<dd>
						SQL標準の
						<code>DATE</code>
						型 (日付のみ) として扱うことを指定します。
					</dd>
					<dt>
						<code>TemporalType.TIME</code>
					</dt>
					<dd>
						SQL標準の
						<code>TIME</code>
						型 (時刻のみ) として扱うことを指定します。
					</dd>
					<dt>
						<code>TemporalType.TIMESTAMP</code>
					</dt>
					<dd>
						SQL標準の
						<code>TIMESTAMP</code>
						型 (日付と時刻) として扱うことを指定します。
					</dd>
				</dl>
				<source><![CDATA[
@Temporal(TemporalType.DATE)
public Date date;
]]></source>
				<div class="caution">
					<div>注意点</div>
					<p>
						Seasar2.4.44 以降と Oracle の組み合わせの場合、デフォルトでは
						<code>@Temporal(TemporalType.TIMESTAMP)</code>
						で注釈された
						<code>java.util.Date</code>
						型および
						<code>java.util.Calendar</code>
						型のプロパティは、Oracle固有の
						<code>DATE</code>
						型として扱われます。<br />
						Seasar2.4.43 以前と同様に
						<code>@Temporal(TemporalType.TIMESTAMP)</code>
						で注釈された
						<code>java.util.Date</code>
						型および
						<code>java.util.Calendar</code>
						型のプロパティをOracleの
						<code>TIMESTAMP</code>
						型として扱いたい場合は、
						<code>s2jdbc.dicon</code>
						で
						<code>OracleDialect</code>
						の
						<code>useOracleDate</code>
						プロパティに
						<code>false</code>
						を設定してください。
					</p>
				</div>
				<source><![CDATA[
    <component name="jdbcManager"
      class="org.seasar.extension.jdbc.manager.JdbcManagerImpl">
        <property name="dialect">
            <component class="org.seasar.extension.jdbc.dialect.OracleDialect">
                <property name="useOracleDate">false</property>
            </component>
        </property>
    ...
]]></source>
			</subsection>

			<subsection name="ラージオブジェクト定義">
				<p>
					<code>byte[]</code>
					・
					<code>Serializable</code>
					・
					<code>String</code>
					型のプロパティはラージオブジェクトにすることができます。 ラージオブジェクトであることを指定するには、
					<code>@Lob</code>
					を使います。
				</p>
				<p>
					<code>@Lob</code>
					が指定されたプロパティが
					<code>byte[]</code>
					・
					<code>Serializable</code>
					型ならBLOB、
					<code>String</code>
					型ならCLOBとなります。
				</p>
				<source><![CDATA[
@Lob
public String largeName;

@Lob
public byte[] largeArray;

@Lob
public LargeDto largeDto;
]]></source>
			</subsection>

			<subsection name="フェッチ対象外定義">
				<p>
					ラージオブジェクトのようにサイズが大きくなるプロパティや、
					通常は必要としないプロパティは
					<a href="s2jdbc_manager_auto.html">
						SQL自動生成
					</a>
					による
					<a href="s2jdbc_manager_auto.html#検索">検索</a>
					でフェッチの対象から除外することができます
					(
					<a href="s2jdbc_manager_auto.html#指定したプロパティをフェッチ対象にする">指定したプロパティをフェッチ対象にする</a>
					ことも可能です)。
				</p>
				<p>
					フェッチ対象外であることを指定するには、
					<code>@Basic</code>
					の
					<code>fetch</code>
					要素を使います。
				</p>
				<source><![CDATA[
@Basic(fetch = FetchType.LAZY)
@Lob
public LargeDto largeDto;
]]></source>
				<div class="caution">
					<div>注意点</div>
					<p>
						S2JDBCは遅延ロードを
						<strong>サポートしません</strong>
						。
					</p>
					<p>
						<code>FetchType.LAZY</code>
						が指定されたプロパティは遅延ロードの対象になるのではなく、単に
						<strong>取得されない</strong>
						だけで、プロパティの値は初期値のままとなります。
					</p>
				</div>
			</subsection>

			<subsection name="永続化対象外定義">
				<p>
					永続化対象外であることを指定するには、
					<code>@Transient</code>
					を使います。
					<code>transient</code>
					修飾子も指定することもできますが、セッションリプリケーションなどの直列化の対象から外れてしまうので、
					<code>@Transient</code>
					の方をお勧めします。
				</p>
				<source><![CDATA[
@Transient
public MyDto myDto;

//こちらはお勧めしない
public transient MyDto myDto2;
]]></source>
			</subsection>
		</section>

		<section name="関連定義">
			<subsection name="多対一関連定義">
				<p>
					多対一関連であることを指定するには、
					<code>@ManyToOne</code>
					を使います。複数の
					<code>Employee</code>
					に1つの
					<code>Departement</code>
					が関連付けられる場合、
					<code>Employee</code>
					からみて
					<code>Department</code>
					は多対一関連になります。
					関連には、所有者、被所有者という概念があり、外部キーを持っているほうが所有者になります。
				</p>
				<p>
					上記のケースは、
					<code>Employee</code>
					のテーブルに、
					<code>department_id</code>
					(プロパティ名は
					<code>departmentId</code>
					)という外部キーがあるので、
					<code>Employee</code>
					は関連の所有者になります。
				</p>
				<p>
					<code>@ManyToOne</code>
					を定義するエンティティは、必ず関連の所有者になるので、外部キーに対応するプロパティが必要です。
				</p>
				<source><![CDATA[
public class Employee {
    ...
    public Integer departementId;
    
    @ManyToOne
    public Department department;
}
]]></source>
			</subsection>

			<subsection name="一対多関連定義">
				<p>
					一対多関連であることを指定するには、
					<code>@OneToMany</code>
					を使います。1つの
					<code>Department</code>
					に複数の
					<code>Employee</code>
					が関連付けられる場合、
					<code>Department</code>
					からみて
					<code>Employee</code>
					は一対多関連になります。
					関連には、所有者、被所有者という概念があり、外部キーを持っているほうが所有者になります。
				</p>
				<p>
					上記のケースは、
					<code>Employee</code>
					のテーブルに、
					<code>department_id</code>
					(プロパティ名は
					<code>departmentId</code>
					)という外部キーがあり、
					<code>Department</code>
					の方は、外部キーを持っていないので、
					<code>Department</code>
					は関連の被所有者になります。
				</p>
				<p>
					関連の被所有者の場合、必ず
					<code>mappedBy</code>
					要素で逆側の関連のプロパティ名を指定します。
					<code>Department</code>
					からみて一対多で
					<code>Employee</code>
					が関連付けられていて、その
					<code>Employee</code>
					からみると
					<code>Department</code>
					が
					<code>department</code>
					プロパティとして、多対一で関連付けられています。
					お互いが相互の関連であることを示すために
					<code>mappedBy</code>
					で
					<code>department</code>
					を指定します。
				</p>
				<p>
					一対多の関連の型は、
					<code>List&lt;エンティティ型&gt;</code>
					にします。
					どのエンティティのリストなのかを示すためにGenericsの指定を忘れないようにしてください。
				</p>
				<source><![CDATA[
public class Department {
    ...
    @OneToMany(mappedBy = "department")
    public List<Employee> employeeList;
}
]]></source>
			</subsection>

			<subsection name="一対一関連定義">
				<p>
					一対一関連であることを指定するには、
					<code>@OneToOne</code>
					を使います。1つの
					<code>Employee</code>
					に1つの
					<code>Address</code>
					が関連付けられる場合、
					<code>Employee</code>
					からみて
					<code>Address</code>
					は一対一関連になります。同じように、1つの
					<code>Address</code>
					に1つの
					<code>Employee</code>
					が関連付けられているので、
					<code>Address</code>
					からみて
					<code>Employee</code>
					も一対一関連になります。
					関連には、所有者、被所有者という概念があり、外部キーを持っているほうが所有者になります。
				</p>
				<p>
					上記のケースは、
					<code>Employee</code>
					のテーブルに、
					<code>address_id</code>
					(プロパティ名は
					<code>addressId</code>
					)という外部キーがあるので、
					<code>Employee</code>
					は関連の所有者になります。
					<code>Address</code>
					の方は、外部キーを持っていないので、
					<code>Address</code>
					は関連の被所有者になります。
				</p>
				<p>
					関連の被所有者の場合、必ず
					<code>mappedBy</code>
					要素で逆側の関連のプロパティ名を指定します。
					<code>Address</code>
					から見ると一対一で
					<code>Employee</code>
					が関連付けられていて、その
					<code>Employee</code>
					からみると
					<code>Address</code>
					が
					<code>address</code>
					プロパティとして、一対一で関連付けられています。
					お互いが相互の関連であることを示すために
					<code>mappedBy</code>
					で
					<code>address</code>を指定します。
				</p>
				<source><![CDATA[
public class Employee {
    ...
    public Integer addressId;
    
    @OneToOne
    public Address address;
}
]]></source>
				<source><![CDATA[
public class Address {
    ...
    @OneToOne(mappedBy = "address")
    public Employee employee;
}
]]></source>
			</subsection>

			<subsection name="結合カラム定義">
				<p>
					外部キーを持っている方を関連の所有者といいますが、関連の所有者側では、
					<code>@JoinColumn</code>
					を使って、結合用のカラムを指定することができます。
				</p>
				<p>
					<code>name</code>
					要素で、外部キーを指定します。
					<code>name</code>
					要素を省略した場合、「
					<var>関連のプロパティ名</var>_<var>関連テーブルの主キー</var>
					」が 自動的に設定されます。
					主キーは、プロパティ名ではなく、カラム名なので注意してください。
				</p>
				<source><![CDATA[
public class Employee {
    ...
    public Integer departementId;
    
    @ManyToOne
    public Department department;
}
]]></source>
				<p>
					上記の例では、
					<code>@JoinColumn</code>
					が省略されているので、
					<code>name</code>
					要素は、「
					<var>関連のプロパティ名</var>(<code>department</code>)_<var>関連テーブルの主キー</var>(<code>ID</code>)
					」、つまり
					<code>DEPARTMENT_ID</code>
					になります。
				</p>
				<p>
					<code>department</code>
					が
					<code>DEPARTMENT</code>
					に変換されているのは、プロパティ名をカラム名に変換するときに、キャメル記法は、
					<code>'_'</code>
					区切りになり、
					<code>'_'</code>
					以外は大文字に変換されるというルールがあるからです。
				</p>
				<p>
					このルールは、
					<code>convention.dicon</code>
					で指定されている
					<code>
						org.seasar.framework.convention.impl.PersistenceNamingConventionImpl
					</code>
					の
					<code>fromPropertyNameToColumnName()</code>
					の実装を変えることで、カスタマイズすることができます。
				</p>
				<p>
					<code>referencedColumnName</code>
					要素で、関連テーブルの主キーを指定します。
					<code>referencedColumnName</code>
					要素を省略した場合、
					「関連テーブルの主キー」が自動的に設定されます。
					主キーは、プロパティ名ではなく、カラム名なので注意してください。
				</p>
				<source><![CDATA[
public class Employee {
    ...
    public Integer departementId;
    
    @ManyToOne
    public Department department;
}
]]></source>
				<p>
					上記の例では、
					<code>@JoinColumn</code>
					が省略されているので、
					<code>referencedColumnName</code>
					要素は、「
					<var>関連テーブルの主キー</var>(<code>ID</code>)
					」、つまり
					<code>ID</code>になります。
				</p>
			</subsection>
		</section>
	</body>
</document>
