Как выполнить транзакцию Datomic, используя идентификатор объекта enum/ref?

Я пытаюсь вставить новый объект в свою базу данных Datomic со ссылками на созданные мной типы enum/ref (:client/gender и :client/referral).

Запись схемы для типа :client/referral выглядит так (и определение :client/gender почти идентично):

{:db/id #db/id[:db.part/db]
  :db/ident :client/referral
  :db/valueType :db.type/ref
  :db/cardinality :db.cardinality/one
  :db/doc "The referral source for this client"
  :db.install/_attribute :db.part/db
  }

[:db/add #db/id[:db.part/user] :db/ident :client.referral/friend]
[:db/add #db/id[:db.part/user] :db/ident :client.referral/online]
[:db/add #db/id[:db.part/user] :db/ident :client.referral/radio]

Функция транзакции выглядит примерно так (я перепробовал все ее варианты):

(defn add-client [client]
  (let [gender (:gender client)
        referral (:referral client)]
    @(d/transact conn
      [{:db/id (d/tempid :db.part/user)
       :client/name (:name client)
       :client/phone (:phone client)
       :client/email (:email client)
       :client/date-of-birth (:dateOfBirth client)
       :client/gender gender
       :client/referral referral}])))

Этот конкретный вариант вызывает следующую ошибку:

java.util.concurrent.ExecutionException: java.lang.IllegalArgumentException: :db.error/not-an-entity Unable to resolve entity: 17592186045422 in datom [#db/id[:db.part/user -1000022] :client/gender "17592186045422"]
              ...
Caused by: datomic.impl.Exceptions$IllegalArgumentExceptionInfo: :db.error/not-an-entity Unable to resolve entity: 17592186045422 in datom [#db/id[:db.part/user -1000022] :client/gender "17592186045422"]
                error.clj:57 datomic.error/arg
                error.clj:55 datomic.error/arg
                  db.clj:555 datomic.db/require-id
                 db.clj:2334 datomic.db/datomic.db.ProcessInpoint
                 db.clj:2317 datomic.db/datomic.db.ProcessInpoint
                 db.clj:2512 datomic.db/with-tx[fn]
   PersistentVector.java:333 clojure.lang.PersistentVector.reduce
               core.clj:6518 clojure.core/reduce
                 db.clj:2512 datomic.db/with-tx[fn]
                 db.clj:2516 datomic.db/with-tx
                peer.clj:558 datomic.peer.LocalConnection/fn
                peer.clj:558 datomic.peer/datomic.peer.LocalConnection
                peer.clj:550 datomic.peer/datomic.peer.LocalConnection
                  api.clj:94 datomic.api/transact
                   ...

Я также пробовал такие варианты (среди прочего), но безрезультатно:

@(d/transact conn
      [{:db/id (d/tempid :db.part/user)
       :client/name (:name client)
       :client/phone (:phone client)
       :client/email (:email client)
       :client/date-of-birth (:dateOfBirth client)
       :client/gender #db/id[:db.user/part gender]
       :client/referral #db/id[:db.user/part referral]}])

Что, наверное, очевидно, я упускаю?


person Stephen Hopper    schedule 12.10.2015    source источник


Ответы (2)


Ваши входные данные являются источником ошибки. Наблюдайте за строкой в ​​позиции значения datom, о котором сообщается в исключении.

[#db/id[:db.part/user -1000022] :client/gender "17592186045422"]

Это должен быть идентификатор гендерной сущности или ключевое слово, идентифицирующее ее через :db/ident.

Убедитесь, что ваша транзакция выглядит примерно так:

[:db/add (d/tempid :db.part/user) :client/gender :gender/male]

(Предположим, что у вас есть сущность с :db/ident :gender/male)

(Примечание: ваше изображение аватара, логотип Clojure, я считаю защищенным авторским правом)

person Leon Grapenthin    schedule 13.10.2015

Я переключился на использование :db/ident для ссылочных типов, и это решило проблему.

@(d/transact conn
           [{:db/id                (d/tempid :db.part/user)
             :client/name          (:name client)
             :client/phone         (:phone client)
             :client/email         (:email client)
             :client/date-of-birth (:dateOfBirth client)
             :client/gender        {:db/ident (:gender client)}
             :client/referral      {:db/ident (:referral client)}}])
person Stephen Hopper    schedule 12.10.2015
comment
Решение, на которое вы наткнулись, на самом деле не устраняет основную ошибку. Это вводит в заблуждение, чтобы оставить его как принято. Ответ, который относится к строке в позиции значения, обеспечивает правильный анализ. - person Ben Kamphaus; 08.05.2016
comment
мне кажется, это ошибка в том, как Datomic расширяет запрос транзакции в Datoms, меня кусает то же самое. По крайней мере, предоставленный ответ дает обходной путь. - person Valentin Waeselynck; 11.08.2016