Java 如何使用CouchbaseTemplate在Spring Data Couchbase中使用密钥前缀

Java 如何使用CouchbaseTemplate在Spring Data Couchbase中使用密钥前缀,java,spring,spring-data,spring-data-couchbase,Java,Spring,Spring Data,Spring Data Couchbase,在Spring Data Couchbase应用程序中,我配置了CouchbaseTemplate bean以使用密钥前缀和delimeter: public class CouchbaseConfig extends AbstractCouchbaseConfiguration { ... @Override @Bean(name = BeanNames.COUCHBASE_TEMPLATE) public CouchbaseTemplate couchba

在Spring Data Couchbase应用程序中,我配置了CouchbaseTemplate bean以使用密钥前缀和delimeter:

public class CouchbaseConfig extends AbstractCouchbaseConfiguration {

    ...

    @Override
    @Bean(name = BeanNames.COUCHBASE_TEMPLATE)
    public CouchbaseTemplate couchbaseTemplate() throws Exception {
        CouchbaseTemplate couchbaseTemplate = super.couchbaseTemplate();

        couchbaseTemplate.keySettings(KeySettings.build()
            .prefix("USER")
            .delimiter("::"));

        return couchbaseTemplate;
    }

  ...
}
我有一个ID为的文档,从文档中的属性生成,如下所示:

@Data
@Document
public class User {
    @Id @GeneratedValue(strategy = GenerationStrategy.USE_ATTRIBUTES)
    private String id;

    @Field
    @IdAttribute
    private String userName;

    @Field
    private String firstName;
}
然后是CouchbaseRepository:

@ViewIndexed(designDoc = "user", viewName = "all")
public interface CouchbaseUserRepository extends CouchbaseRepository<User, String> {
}
以及以下测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserRepositoryIntegrationTest {
    private static final String USERNAME = "username";

    @Autowired
    private UserRepository userRepository;

    @Before
    public void setup()  {
        userRepository.deleteAll();
        User user = new User();
        user.setUserName(USERNAME);
        userRepository.save(user);
    }

    @Test
    public void testSave() {
        User user = userRepository.findByUserName(USERNAME);
        user.setFirstName("Fred");
        userRepository.save(user);

    }

}
当我运行测试时,我的存储桶中有两个文档:

USER::USER::username{"firstName":"Fred","_class":"com.example.couchbase.resiliency.User","userName":"username"}
USER::username{"userName":"username","_class":"com.example.couchbase.resiliency.User"}
似乎当测试加载实体时,对象显然有一个ID。但是,当再次保存时,在保存之前会再次添加密钥前缀,这意味着会保存第二个文档,因为此新ID不存在

  • 如何阻止密钥前缀被添加两次
  • 有没有更优雅的方法来实现findByUserName 方法?从Spring数据Couchbase文档中可以看出 就像你必须要求CouchbaseTemplate生成 在将其传递给Couchbase存储库之前,您已完成 方法

作为参考,我正在Spring Boot 1.5.19应用程序中使用Spring Data Couchbase v 2.2.18。

您在模板上定义前缀和分隔符的原因是什么?尝试仅在
用户
对象上定义它们,如so
@Id@GeneratedValue(strategy=GenerationStrategy.USE_属性,delimiter=“::”
@IdPrefix private final String IdPrefix=“User”我们尝试过这个,但没有成功,但我们再次尝试,并设法让它工作。很明显,我们的解决方案出了问题。糟糕的一天:)谢谢你在模板上定义前缀和分隔符的原因是什么?尝试仅在
用户
对象上定义它们,如so
@Id@GeneratedValue(strategy=GenerationStrategy.USE_属性,delimiter=“::”
@IdPrefix private final String IdPrefix=“User”我们尝试过这个,但没有成功,但我们再次尝试,并设法让它工作。很明显,我们的解决方案出了问题。糟糕的一天:)谢谢
USER::USER::username{"firstName":"Fred","_class":"com.example.couchbase.resiliency.User","userName":"username"}
USER::username{"userName":"username","_class":"com.example.couchbase.resiliency.User"}