首页 文章

Spring Couchbase CrudRepository类型安全吗?

提问于
浏览
0

我正在评估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中的原始文档时,我发现每个都包含一个“_class”属性,可能用于识别用于表示数据的类,并检测此类错误匹配 .

1 回答

  • 0

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

    应用程序端解决方案是存储具有不同键的实体,在 Entity1 的情况下,id为 1 ,类似于: 1-Entity1 作为键 .

    也许你可以通过类似于这个的方法解决问题:

    public Entity1 {
    
        private static final String ENTITY_NAME = "ENTITY1";
    
        @Id
        private String key;
    
        public void setKey(String key) {
            this.key = key;
        }
    
        public String getKey(String key) {
            return this.key;
        }
    
        public void setId(String id) {
            this.key = ENTITY_NAME + ":" + id;
        }
    
        public String getId() {
            if (null == this.key) 
                return null;
            return this.key.substring(ENTITY_NAME.length()+1);
        }
    
    }
    

相关问题