0

我在 java 8 中编写了一个代码,以使用 apache cayenne 3.1 在 sql server 2012 中插入数据。执行代码时出现异常: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'

我已经通过将我在 cayenne 建模器中的 pk 生成策略从默认更改为数据库生成来解决了这个问题。但是当我再次执行我的 java 代码时,假设只在数据库中插入 1 条记录,但它也插入了我在异常中得到的上一条记录。我已经尝试三次创建相同的场景,但得到了相同的结果。我也尝试在出现异常后重新启动我的 Web 服务器和 SQL Server 服务,但是在插入新数据的同时也插入了异常记录。这个问题也可以通过在我的 catch 块中插入一个回滚语句来解决。

但我想知道 apache cayenne 在插入新数据时如何以及为什么插入异常数据。

这是我的代码。 Java : 人道

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