JDBI SqlBatch вставляет только одну запись - PullRequest
1 голос
/ 05 мая 2020

У меня проблемы с JDBI, когда вставляется только первый элемент в списке

    data class UserResourceRow(
      val userId: UserId,
      val roleId: RoleId,
      val resource: Resource,
      val modified: Instant,
      val auditUserId: UserId,
      val deleted: Boolean
    )
    CREATE TABLE `user_resource` (
      `user_id` varchar(36) CHARACTER SET ascii NOT NULL,
      `resource` varchar(36) CHARACTER SET ascii NOT NULL,
      `role_id` int(11) NOT NULL,
      `modified_timestamp` timestamp(3) NOT NULL DEFAULT current_timestamp(3),
      `audit_user_id` varchar(36) CHARACTER SET ascii NOT NULL,
      `deleted` tinyint(1) NOT NULL DEFAULT 0,
      PRIMARY KEY (`user_id`,`resource`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb;
    @Transaction
    @SqlBatch(
        """
        INSERT INTO user_resource
        VALUES (:userId, :resource, :roleId, :modified, :auditUserId, :deleted)
        """
    )
    @Throws(JdbiException::class)
    fun upsert(@BindBean grants: List<UserResourceRow>): IntArray

Я называю это, например,

    val upsert = grantsDao.upsert(grants)

, где гранты список, содержащий эти два

    UserResourceRow(userId=22, roleId=123, resource=resource.property.789, modified=2020-05-05T00:48:01.644Z, auditUserId=321, deleted=false)

    UserResourceRow(userId=22, roleId=123, resource=resource.property.456, modified=2020-05-05T00:48:01.644Z, auditUserId=321, deleted=false)

, вызов завершается успешно, и upsert возвращает intArray или [-2, -2]

Тот факт, что есть две записи, говорит мне, что он думает, что вставил две строки , но я не понимаю, почему значения intArray равны -2 и -2, разве это не должно быть intArray [1, 1]?

, а таблица содержит только первую запись списка

    mysql> select * from user_resource;
    +---------+-----------------------+---------+-------------------------+---------------+---------+
    | user_id | resource              | role_id | modified_timestamp      | audit_user_id | deleted |
    +---------+-----------------------+---------+-------------------------+---------------+---------+
    | 22      | resource.property.789 |      123 | 2020-05-05 00:48:01.644 | 321           |       0 |
    +---------+-----------------------+---------+-------------------------+---------------+---------+
    1 row in set (0.00 sec)

Тот факт, что он успешно вставил одну запись, говорит мне, что нет проблем с @BindBean сопоставлением столбцов с атрибутами класса данных UserResourceRow, но я не понимаю, почему вставляется только первая запись?

1 Ответ

0 голосов
/ 06 мая 2020

Я потратил МНОГО времени на то, чтобы отладить это, и не смог найти ничего плохого ни в JDBI, ни в драйвере - утверждения, которые передавались через сокет на сервер, выглядели нормально. (и они были)

Оказывается, это должно быть связано с некоторым тонким несоответствием версий между базовым db в памяти, используемым в тесте

        <dependency>
            <groupId>ch.vorburger.mariaDB4j</groupId>
            <artifactId>mariaDB4j</artifactId>
            <version>2.3.0</version>
        </dependency>

и используемым mariadbclient

        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <version>2.2.1</version>
        </dependency>

, потому что, когда я нажимаю их на

        <dependency>
            <groupId>ch.vorburger.mariaDB4j</groupId>
            <artifactId>mariaDB4j</artifactId>
            <version>2.4.0</version>
        </dependency>

и

        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <version>2.6.0</version>
        </dependency>

, проблема не воспроизводится.

В org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol есть несколько интересных строк, относящихся к версиям и операторам групповой / пакетной обработки, возможно, где-то там было несоответствие.

...