Spring Couchbase CrudRepository类型安全吗?

时间:2014-07-15 21:53:39

标签: java spring spring-data couchbase spring-data-couchbase

我正在评估Spring Data对Couchbase的支持,并且遇到了以下问题。考虑以下伪代码示例,其中包含两个POJO类,以及为每个类定义和实例化的存储库:

public class Foo
{
    @Id
    private String  _id;

    @Version
    private Long    _rev;

    // .. Other data and members.
}

public class Bar
{
    @Id
    private String  _id;

    @Version
    private Long    _rev;

    // .. Other data and members.
}


//
// Repositories
//

@Repository
public interface FooRepository extends CrudRepository<Foo, String> {
}

@Repository
public interface BarRepository extends CrudRepository<Bar, String> {
}

两个存储库都使用相同的Couchbase存储桶。下一个:

// Create a new Foo object and save it.
Foo f = new Foo( "id_1" );
fooRepository.save( f );

// Now, try fetching a Bar object using the ID of a Foo object (?)
Bar b = barRepository.findOne( "id_1" );

这导致返回Bar对象,但未正确初始化 - 不会引发异常。问题是,为什么这个场景中没有指出错误?当请求的类型与持久类型不匹配时,引发异常似乎并不大。我错过了什么吗?

FWIW,当我通过管理控制台查看Couchbase中的原始文档时,我发现每个文档都包含一个&#34; _class&#34;大概可以使用属性来识别用于表示数据的类,并检测这种不匹配。

1 个答案:

答案 0 :(得分:0)

这里的问题是文档(JSON序列化实体)与其他实体在同一个存储桶上的id(@Id字段)关联存储,这会产生一种歧义,保存Entity1标识1,将覆盖标识为Entity2的{​​{1}}。

应用程序端解决方案是存储具有不同密钥的实体,如果1的标识为Entity1,则为1作为密钥。

也许你可以通过与此类似的方法解决问题:

1-Entity1