Apache Cayenne 3.1を使用してSQL Server 2012にデータを挿入するコードをJava 8で作成しました。コードの実行中に例外が発生しました: org.apache.cayenne.CayenneRuntimeException: [v.3.1 Sep 20 2014 14:24:57] Commit Exception Caused by: java.sql.SQLException: Could not find stored procedure 'auto_pk_for_table' .
私はカイエン モデラーの pk 生成戦略をデフォルトからデータベース生成に変更することで問題を解決しました。しかし、Java コードを再度実行すると、データベースにレコードを 1 つだけ挿入するはずでしたが、例外で取得した前のレコードも挿入されました。同じシナリオを 3 回作成しようとしましたが、同じ結果が得られました。例外が発生した後、WebサーバーとSQLサーバーのサービスを再起動しようとしましたが、新しいデータを挿入するときに例外レコードも同時に挿入されました。この問題は、catch ブロックにロールバック ステートメントを挿入することでも解決されます。
しかし、新しいデータを挿入するときに、apache cayenne が例外的なデータを挿入する方法と理由を知りたいです。
これは私のコードです。 Java : PersonDao
try {
Person person = new Person();
person.setFirstName("John");
person.setLastName("Cross");
ObjectContext context = BaseContext.getThreadObjectContext();
context.registerNewObject(person);
context.commitChanges();
} catch (CayenneRuntimeException e) {
context.rollbackChanges();
throw e;
}
XML ファイル: cayenne-test.xml
<?xml version="1.0" encoding="utf-8"?>
<domain project-version="6">
<property name="cayenne.DataDomain.usingExternalTransactions" value="true"/>
<map name="MastersDataMap"/>
<node name="MastersDataNode" factory="org.apache.cayenne.configuration.server.XMLPoolingDataSourceFactory" schema-update-strategy="org.apache.cayenne.access.dbsync.CreateIfNoSchemaStrategy">
<map-ref name="MastersDataMap"/>
<data-source>
<driver value="net.sourceforge.jtds.jdbc.Driver"/>
<url value="jdbc:jtds:sqlserver://localhost:1433/test"/>
<connectionPool min="1" max="30"/>
<login userName="sa" password="admin@123"/>
</data-source>
</node>
</domain>
TestDataMap.map.xml
<?xml version="1.0" encoding="utf-8"?>
<data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
project-version="6">
<property name="defaultPackage" value="com.org.ivcargo.platform.dto"/>
<db-entity name="PersonTemp" schema="dbo" catalog="test">
<db-attribute name="personId" type="NUMERIC" isPrimaryKey="true" isGenerated="true" isMandatory="true" length="10"/>
<db-attribute name="firstname" type="VARCHAR" length="100"/>
<db-attribute name="lastname" type="VARCHAR" length="100"/>
</db-entity>
<obj-entity name="PersonTemp" className="com.org.ivcargo.platform.dto.PersonTemp" dbEntityName="PersonTemp">
<obj-attribute name="personId" type="java.lang.Long" lock="true" db-attribute-path="personId"/>
<obj-attribute name="firstname" type="java.lang.String" db-attribute-path="firstname"/>
<obj-attribute name="lastname" type="java.lang.String" db-attribute-path="lastname"/>
</obj-entity>
</data-map>