S2JDBC-GenでDDLを出力してみると

今までは単一テーブルでの調査をしていました。
今後は複数テーブル(Join)を見ていきます。では、早速テーブルを作成します。
まずは最初のテーブルです。

<Script文(自分で作成)>
CREATE TABLE "S_COMPANY"
( "COM_ID" NUMBER(5,0) NOT NULL ENABLE,
"COM_NAME" VARCHAR2(60) NOT NULL ENABLE,
"Version" NUMBER(8,0),
"REGIST_DATE" DATE,
"CHANGE_DATE" DATE,
"DELETE_DATE" DATE,
CONSTRAINT "SCOMPANY_PK" PRIMARY KEY ("COM_ID") ENABLE
)

<Entity>
@Entity
public class SCompany {

/** comIdプロパティ */
@Id
@Column(precision = 5, nullable = false, unique = true)
public Integer comId;

/** comNameプロパティ */
@Column(length = 60, nullable = false, unique = false)
public String comName;

/** versionプロパティ */
@Version
@Column(precision = 8, nullable = true, unique = false)
public Integer version;

/** registDateプロパティ */
@Temporal(TemporalType.DATE)
@Column(nullable = true, unique = false)
public Date registDate;

/** changeDateプロパティ */
@Temporal(TemporalType.DATE)
@Column(nullable = true, unique = false)
public Date changeDate;

/** deleteDateプロパティ */
@Temporal(TemporalType.DATE)
@Column(nullable = true, unique = false)
public Date deleteDate;
}

うまくきますね。
では、MigrateにあるDDLを見てみます(今後はこのScriptを使用するので)。

S2JDBC-Genを実行後>
create table S_COMPANY (
COM_ID number(10,0) not null,
COM_NAME varchar2(60) not null,
VERSION number(10,0),
REGIST_DATE date,
CHANGE_DATE date,
DELETE_DATE date,
constraint S_COMPANY_PK primary key(COM_ID)
);

あれ?
Numberが10に統一されています。このままテーブルを貼り付けると、
Long型になってしまいますね。

先にすすめるので、とりあえず作成されたEntityのテストクラスを実行してみます。

<Entityのテストクラス>
public class SCompanyTest extends S2TestCase {

private JdbcManager screenjdbcManager;

/**
* 事前処理をします。
*
* @throws Exception
*/
@Override
protected void setUp() throws Exception {
super.setUp();
include("s2jdbc.dicon");
}

/**
* 識別子による取得をテストします。
*
* @throws Exception
*/
public void testFindById() throws Exception {
screenjdbcManager.from(SCompany.class).id(1).getSingleResult();
}
}

あら?エラーですね。

org.seasar.framework.exception.SQLRuntimeException: [ESSR0072]SQLで例外(SQL=[select T1_.COM_ID as C1_, T1_.COM_NAME as C2_, T1_.VERSION as C3_, T1_.REGIST_DATE as C4_, T1_.CHANGE_DATE as C5_, T1_.DELETE_DATE as C6_ from S_COMPANY T1_ where T1_.COM_ID = ?], Message=[[ESSR0072]SQLで例外(SQL=[select T1_.COM_ID as C1_, T1_.COM_NAME as C2_, T1_.VERSION as C3_, T1_.REGIST_DATE as C4_, T1_.CHANGE_DATE as C5_, T1_.DELETE_DATE as C6_ from S_COMPANY T1_ where T1_.COM_ID = ?], Message=[904], ErrorCode=42000, SQLState={3})が発生しました : [SQLで例外(Message=[ORA-00904: "T1_"."VERSION": 無効な識別子です。
], ErrorCode=904, SQLState=42000)が発生しました。], [ORA-00904: "T1_"."VERSION": 無効な識別子です。
], ErrorCode=904, SQLState=42000)が発生しました
at org.seasar.framework.util.PreparedStatementUtil.executeQuery(PreparedStatementUtil.java:51)
at org.seasar.extension.jdbc.query.AbstractSelect$6.handle(AbstractSelect.java:411)
at org.seasar.extension.jdbc.query.AbstractSelect$6.handle(AbstractSelect.java:410)
at org.seasar.extension.jdbc.query.AbstractSelect$1.handle(AbstractSelect.java:283)
at org.seasar.extension.jdbc.query.AbstractSelect$1.handle(AbstractSelect.java:281)
at org.seasar.extension.jdbc.manager.JdbcContextImpl.usingPreparedStatement(JdbcContextImpl.java:144)
at org.seasar.extension.jdbc.query.AbstractSelect.processPreparedStatement(AbstractSelect.java:278)
at org.seasar.extension.jdbc.query.AbstractSelect.processResultSet(AbstractSelect.java:407)
at org.seasar.extension.jdbc.query.AbstractSelect.getSingleResultInternal(AbstractSelect.java:232)
at org.seasar.extension.jdbc.query.AbstractSelect.getSingleResult(AbstractSelect.java:177)
at jp.globalsystems.businessflow.entity.SCompanyTest.testFindById(SCompanyTest.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:164)
at org.seasar.framework.unit.S2FrameworkTestCase.doRunTest(S2FrameworkTestCase.java:519)
at org.seasar.extension.unit.S2TestCase.doRunTest(S2TestCase.java:103)
at org.seasar.framework.unit.S2FrameworkTestCase.runBare(S2FrameworkTestCase.java:308)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at junit.framework.TestSuite.runTest(TestSuite.java:230)
at junit.framework.TestSuite.run(TestSuite.java:225)
at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:81)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:38)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
Caused by: org.seasar.framework.exception.SSQLException: [ESSR0072]SQLで例外(SQL=[select T1_.COM_ID as C1_, T1_.COM_NAME as C2_, T1_.VERSION as C3_, T1_.REGIST_DATE as C4_, T1_.CHANGE_DATE as C5_, T1_.DELETE_DATE as C6_ from S_COMPANY T1_ where T1_.COM_ID = ?], Message=[904], ErrorCode=42000, SQLState={3})が発生しました
at org.seasar.extension.jdbc.impl.PreparedStatementWrapper.wrapException(PreparedStatementWrapper.java:72)
at org.seasar.extension.jdbc.impl.PreparedStatementWrapper.wrapException(PreparedStatementWrapper.java:67)
at org.seasar.extension.jdbc.impl.PreparedStatementWrapper.executeQuery(PreparedStatementWrapper.java:83)
at org.seasar.framework.util.PreparedStatementUtil.executeQuery(PreparedStatementUtil.java:49)
... 31 more
Caused by: java.sql.SQLException: ORA-00904: "T1_"."VERSION": 無効な識別子です。

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:743)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:799)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1038)
at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:839)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1133)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3285)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3329)
at org.seasar.extension.jdbc.impl.PreparedStatementWrapper.executeQuery(PreparedStatementWrapper.java:81)
... 32 more


無効な識別子?VERSIONは使用してはいけない?という事はないので、調査ですね。DELETE_DATEとか、このあたりの名前の付け方がもしかするといけないのかもしれないです。

DDLについては、他に作成したテーブルのデータを見ると、

public class OrderVoucher {

/** idプロパティ */
@Id
@Column(precision = 10, nullable = false, unique = true)
public Long id;

/** versionプロパティ */
@Version
@Column(precision = 10, nullable = false, unique = false)
public Long version;
}

としています。このテーブルの方が先にできるので、影響しているのかもしれないです(テーブル毎にIDやVersionの値を変えるというのはテーブル設計上、問題ありですが)。
この両方のテーブルは、別々のスキーマに定義していますので、影響はないと思いますが。

まずはVM上で動かしているEclipseを一度再起動してみます。同じでした。。。
今日の夜の課題です。