<?xml version="1.0" encoding="UTF-8"?>
<document xmlns="http://maven.apache.org/XDOC/2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/XDOC/2.0 http://maven.apache.org/xsd/xdoc-2.0.xsd">
	<properties>
		<title>更新</title>
	</properties>
	<body>
		<section name="目次">
			<ul>
				<li><a href="#概要">概要</a></li>
				<li><a href="#SQLの自動生成による更新">SQLの自動生成による更新</a></li>
				<li><a href="#SQLファイルによる更新">SQLファイルによる更新</a></li>
			</ul>
		</section>
		<section name="概要">
			<p>
				SQLはすべてバインド変数（?）を使った準備された文に変換されて実行されますが、
				このドキュメントでは、発行されたSQLがどのようなものかわかりやすくするためにバインド変数を実際の値に置き換えたログ用のSQLを示します。
			</p>
		</section>
		<section name="SQLの自動生成による更新">
			<p>
				<a href="https://www.seasar.org/svn/doma/trunk/doma-tutorial/src/test/java/tutorial/UpdateTest.java">src/test/java/tutorial/UpdateTest.java</a>のtestUpdateメソッドを参照してください。
				SQLの自動生成による更新です。
			</p>
			<p>
				使用するDaoのメソッド定義は次のとおりです。
			</p>
<source><![CDATA[@Update
int update(Employee employee);]]></source>
			<p>
				Daoのメソッドは次のように呼び出します。
			</p>
<source><![CDATA[Employee employee = dao.selectById(1);
employee.setName("hoge");
employee.setJobType(JobType.PRESIDENT);

dao.update(employee);]]></source>
			<p>
				SQLのログは次のように出力されます（改行しています）。
			</p>
<source><![CDATA[update Employee 
set 
  JOB_TYPE = 'PRESIDENT', 
  name = 'hoge', 
  updateTimestamp = '2009-11-21 17:06:37.593',
  VERSION = 1 + 1 
where 
  id = 1 
  and 
  VERSION = 1]]></source>
			<p>
				@Versionが注釈されたversionプロパティに対応するカラムは検索条件に含まれます。
				また、versionプロパティに対応するカラムが増分して更新されます。
			</p>
			<p>
				updateTimestampプロパティはEmployeeListenerで自動設定されます。
				<a href="https://www.seasar.org/svn/doma/trunk/doma-tutorial/src/main/java/tutorial/entity/EmployeeListener.java">src/test/java/tutorial/EmployeeListener.java</a>を参照してください。
			</p>
			<p>
				エンティティクラスに@OriginalStatesが注釈されたプロパティがある場合、
				バージョン番号を除き、
				Daoから取得後に変更された値のみがUPDATE文のSET句に含まれます。
			</p>
		</section>
		<section name="SQLファイルによる更新">
			<p>
				<a href="https://www.seasar.org/svn/doma/trunk/doma-tutorial/src/test/java/tutorial/UpdateTest.java">src/test/java/tutorial/UpdateTest.java</a>のtestUpdateWithSqlFileメソッドを参照してください。
				SQLファイルによる更新です。
			</p>
			<p>
				使用するDaoのメソッド定義は次のとおりです。
				@UpdateのsqlFile要素にtrueを指定します。
			</p>
<source><![CDATA[@Update(sqlFile = true)
int updateWithSqlFile(Employee employee);]]></source>
			<p>
				Daoのメソッドに対応するSQLファイルのパスはMETA-INF/tutorial/dao/EmployeeDao/updateWithSqlFile.sqlです。
				SQLファイルには次のように記述されています。
			</p>
<source><![CDATA[update Employee 
set 
  NAME = /* employee.name */'test', 
  AGE = /* employee.age */10, 
  DEPARTMENT_ID = /* employee.departmentId */1,
  HIREDATE = /* employee.hiredate */date'2010-01-01', 
  JOB_TYPE = /* employee.jobType */'SALESMAN', 
  SALARY = /* employee.salary */300, 
  UPDATETIMESTAMP = /* employee.updateTimestamp */timestamp'2010-01-01 12:34:56', 
  VERSION = /* employee.version */1
where
  ID = /* employee.id */1]]></source>
			<p>
				Daoのメソッドは次のように呼び出します。
			</p>
<source><![CDATA[Employee employee = dao.selectById(1);
employee.setName("hoge");
employee.setJobType(JobType.PRESIDENT);

dao.updateWithSqlFile(employee);]]></source>
			<p>
				SQLのログは次のように出力されます。
			</p>
<source><![CDATA[update Employee 
set 
  NAME = 'hoge', 
  AGE = 30, 
  DEPARTMENT_ID = 1,
  HIREDATE = '2008-01-20', 
  JOB_TYPE = 'PRESIDENT', 
  SALARY = 1600, 
  UPDATETIMESTAMP = null, 
  VERSION = 1
where
  ID = 1]]></source>
			<p>
				SQLファイルによる更新では、バージョンの自動増分は行われません。
				また、エンティティリスナーも呼び出されません。
			</p>
			<p>
				SQLファイルによる更新では、エンティティクラスに@OriginalStatesが注釈されたプロパティがあってもそのプロパティは使用されません。
			</p>
		</section>
	</body>
</document>