Datomic データベースに、他のユーザー タイプに従うことができるユーザー エンティティ タイプがあります。私の問題は、あるユーザーがすでにフォローしている別のユーザーをフォローしているときに発生します。
User A follows user B and also User B follows user A
(Cheshire を使用して) シリアル化しようとすると、属性の無限再帰が原因で (私が推測している) StackOverflowError が発生し:user/follows-users
ます。
このような方法で相互に参照する 2 つの Datomic エンティティを (API の json に) シリアル化するにはどうすればよいですか?
基本的なスキーマは次のとおりです。
; 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)