我的 Datomic 数据库中有一个用户实体类型,它可以遵循其他用户类型。当一个用户关注另一个已经关注他们的用户时,我的问题就出现了:
User A follows user B and also User B follows user A
当我尝试序列化(使用 Cheshire)时,由于(我猜):user/follows-users
属性上的无限递归,我得到了 StackOverflowError。
我将如何序列化(对于 API 的 json)两个以这种方式相互引用的 Datomic 实体?
这是一个基本架构:
; schema
[{:db/id #db/id[:db.part/db]
:db/ident :user/username
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
:db/unique :db.unique/identity
:db.install/_attribute :db.part/db}
{:db/id #db/id[:db.part/db]
:db/ident :user/follows-users
:db/valueType :db.type/ref
:db/cardinality :db.cardinality/many
:db.install/_attribute :db.part/db}
; create users
{:db/id #db/id[:db.part/user -100000]
:user/username "Cheech"}
{:db/id #db/id[:db.part/user -200000]
:user/username "Chong"}
; create follow relationships
{:db/id #db/id[:db.part/user -100000]
:user/follows-users #db/id[:db.part/user -200000]}
{:db/id #db/id[:db.part/user -200000]
:user/follows-users #db/id[:db.part/user -100000]}]
一旦在 repl 上设置了数据库等:
user=> (use '[cheshire.core :refer :all])
nil
user=> (generate-string (d/touch (d/entity (d/db conn) [:user/username "Cheech"])))
StackOverflowError clojure.lang.RestFn.invoke (RestFn.java:433)