【问题标题】:References to the same instance if objects are based on the same NodeEntity如果对象基于相同的 NodeEntity,则引用相同的实例
【发布时间】:2015-07-28 14:21:49
【问题描述】:

假设我有一个名为 Foo 的简单类。 Foo 只有一个字段,一个名为 name 的字符串。

如果我已将 Foo 类型的对象持久保存到数据库中,并且我有一个存储库,允许我通过名称或 ID 在数据库中查找 Foo 对象,是否可以获取对单个实例的引用,以便在下一个例子:

// The Foo node with name "bar" has id 1
Foo foo1 = fooRepository.findOne(1);
Foo foo2 = fooRepository.findByName("bar");

foo1 和 foo2 都引用同一个对象?

编辑:我使用的是 Spring Data Neo4j 3.2.1。

【问题讨论】:

  • 可能有一种 Neo4j 特定的方式,但另一种方式是 AOP,它围绕每个返回 Foo 的方法以及将对象返回到单例的更改...
  • 完全依赖fooRepository的行为。每次调用都会构建一个新的吗?维护一个缓存,以便它可以重新返回以前找到的实例?
  • 在这种情况下,fooRepository 是扩展GraphRepository<Foo> 的接口,因此findByName() 是派生的查找器方法。这两种方法都是派生或继承的。
  • 我不知道存储库是如何在内部实现的,但我怀疑 foo1 和 foo2 不太可能引用同一个对象。它们应该是平等的,而是独立的对象……但是为什么你需要那种深入的知识呢?
  • @cichystefan:是的,默认情况下 foo1 和 foo2 不会引用同一个对象:将创建一个单独的对象来表示两种情况下的相同数据。我怀疑在这种情况下,由于性能和/或资源使用情况,用户希望确保重新使用先前实例化(可能很重)的对象。

标签: java spring neo4j spring-data spring-data-neo4j


【解决方案1】:

SDN3 中没有实体的客户端缓存。

所以你得到了一个新的实例。

在 SDN4 中可能会有所不同,不确定。

【讨论】:

  • 在 SDN 4 中,它们将引用同一个对象。这仅适用于它们都在同一个 SDN 会话中加载的情况。
猜你喜欢
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 2020-11-21
  • 2012-05-05
相关资源
最近更新 更多