Clojure 如何使用enum/ref的实体id执行Datomic事务?

Clojure 如何使用enum/ref的实体id执行Datomic事务?,clojure,enums,ref,datomic,Clojure,Enums,Ref,Datomic,我正试图将一个新实体插入到我的Datomic数据库中,其中引用了我创建的枚举/引用类型(:client/gender和:client/reference) :client/reference类型的模式条目如下所示(并且:client/gender定义几乎相同): transaction函数看起来像这样(我已经尝试过它的各种变体): 此特定变化会产生以下错误: java.util.concurrent.ExecutionException: java.lang.IllegalArgumentExc

我正试图将一个新实体插入到我的Datomic数据库中,其中引用了我创建的枚举/引用类型(
:client/gender
:client/reference

:client/reference
类型的模式条目如下所示(并且
:client/gender
定义几乎相同):

transaction函数看起来像这样(我已经尝试过它的各种变体):

此特定变化会产生以下错误:

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]}])

我缺少了什么,可能很明显的东西?

我切换到使用: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)}}])

您的输入数据是错误源。观察抛出异常中报告的datom值位置的字符串

[#db/id[:db.part/user-1000022]:客户/性别“17592186045422”]

它应该是性别实体的实体ID,或者是通过:db/ident对其进行标识的关键字

确保您的事务的内容如下:

[:db/add (d/tempid :db.part/user) :client/gender :gender/male]
(假设您的实体具有
:db/ident:gender/male


(旁注:我相信您的头像Clojure徽标是受版权保护的)

您偶然发现的解决方案实际上并没有解决潜在的错误。把它当作是被接受的是误导。引用“值位置中的字符串”的答案提供了正确的分析。在我看来,这是Datomic将事务请求扩展为DATOM的方式中的一个错误,我也被同样的问题所困扰。至少提供的答案提供了一个解决方法。
@(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)}}])
[:db/add (d/tempid :db.part/user) :client/gender :gender/male]