0

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>
4

0 に答える 0