{"id":2162,"date":"2016-02-10T12:33:50","date_gmt":"2016-02-10T12:33:49","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2162"},"modified":"2025-10-09T07:25:03","modified_gmt":"2025-10-09T14:25:03","slug":"spring-data-couchbase-2-0-release","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/spring-data-couchbase-2-0-release\/","title":{"rendered":"Anunciando o lan\u00e7amento do Spring Data Couchbase 2.0"},"content":{"rendered":"<p>O Spring Data Couchbase 2.0 \u00e9 uma reescrita do conector original do Spring Data Couchbase 1.4.x. Ele \u00e9 baseado no Couchbase Java 2.2 SDK e faz uso intenso da nova linguagem de consulta N1QL (que foi introduzida no Couchbase Server 4.0) para oferecer mais recursos aos usu\u00e1rios do Spring Data.<\/p>\n<p>O <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/spring-data-couchbase-2.0-preview\/\">Primeiro marco<\/a> foi lan\u00e7ado em agosto do ano passado, seguido de um Release Candidate e, desde ent\u00e3o, recursos adicionais (e corre\u00e7\u00f5es de bugs) foram implementados, e agora a vers\u00e3o GA pode ser liberada para o p\u00fablico.<\/p>\n<p>Vamos fazer um r\u00e1pido tour pelo que mudou (com uma nota\u00e7\u00e3o de \u2b50 a \u2b50\u2b50\u2b50\u2b50 de qu\u00e3o incr\u00edvel e significativo achamos que cada recurso \u00e9?)<\/p>\n<h2 id=\"toc_0\">Novos recursos no Spring Data Couchbase 2.0<\/h2>\n<p>As principais diferen\u00e7as entre a gera\u00e7\u00e3o 1.x do <a href=\"https:\/\/docs.couchbase.com\/sdk-extensions\/spring-data-couchbase.html\">Dados do Spring Couchbase<\/a> e sua vers\u00e3o 2.x s\u00e3o:<\/p>\n<ul>\n<li>Os elementos de configura\u00e7\u00e3o est\u00e3o mais pr\u00f3ximos da realidade do Couchbase: Ambiente, Cluster, Bucket (potencialmente permitindo que voc\u00ea crie <code>CouchbaseTemplate<\/code>s que se conectam a um bucket diferente, ou at\u00e9 mesmo a clusters diferentes!)<\/li>\n<li>O backup de m\u00e9todos de reposit\u00f3rio personalizados nem sempre \u00e9 mais feito com exibi\u00e7\u00f5es; agora \u00e9 (por padr\u00e3o) feito por meio do N1QL, que \u00e9 muito mais flex\u00edvel e exige menos manuten\u00e7\u00e3o no lado do servidor.<\/li>\n<li>Os m\u00e9todos personalizados que usam exibi\u00e7\u00f5es foram um pouco modificados para se adequarem melhor \u00e0 filosofia do Spring Data. Isso reduz um pouco a flexibilidade, mas as implementa\u00e7\u00f5es s\u00e3o geradas a partir do nome do m\u00e9todo (por meio de \"deriva\u00e7\u00e3o de consulta\").<\/li>\n<li>Agora, voc\u00ea pode fazer consultas geoespaciais de seus dados (ou consultas multidimensionais, se for al\u00e9m de 3 dimens\u00f5es) com visualiza\u00e7\u00f5es.<\/li>\n<\/ul>\n<p>\u00c9 claro que voc\u00ea ainda pode acessar a API de n\u00edvel inferior usando o <code>CouchbaseTemplate<\/code> em vez de <code>CouchbaseRepository<\/code> e voc\u00ea pode at\u00e9 mesmo acessar a interface subjacente <code>Balde<\/code> do SDK.<\/p>\n<h2 id=\"toc_1\">M\u00e9todos de reposit\u00f3rio por meio do N1QL<\/h2>\n<p>\u2b50\u2b50\u2b50<\/p>\n<p>O grande novo recurso do Couchbase 4.0 \u00e9 <strong>N1QL<\/strong>uma extens\u00e3o SQL que funciona em documentos JSON (portanto, adicionou especificidades relacionadas ao JSON ao SQL).<\/p>\n<p>Isso \u00e9 especialmente bom para o <code>Reposit\u00f3rio<\/code> padr\u00e3o e deriva\u00e7\u00e3o de consultas no Spring Data, porque a grande maioria das palavras-chave de deriva\u00e7\u00e3o de consultas pode ser facilmente traduzida para N1QL.<\/p>\n<p>O N1QL agora \u00e9 o recurso padr\u00e3o de apoio do Couchbase para os m\u00e9todos do Reposit\u00f3rio. Voc\u00ea tamb\u00e9m pode optar por usar a interface @Query se quiser ser expl\u00edcito na consulta executada.<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">public interface UserRepository extends Repository&lt;User, String&gt; {\r\n\r\n  User findByUsernameEquals(String username);\r\n\r\n  List findByUsernameContains(String contains);\r\n\r\n  @Query \/\/optional for N1QL query derivation but more explicit\r\n  List findByAgeBetween(int minAge, int maxAge);\r\n}<\/code><\/pre>\n<\/div>\n<h2 id=\"toc_2\">M\u00e9todos de reposit\u00f3rio por meio de visualiza\u00e7\u00f5es<\/h2>\n<p>\u2b50\u2b50<\/p>\n<p>Uma grande mudan\u00e7a nesta vers\u00e3o \u00e9 que, agora, as consultas de reposit\u00f3rio (tamb\u00e9m conhecidas como m\u00e9todos de reposit\u00f3rio personalizados) baseadas em exibi\u00e7\u00f5es est\u00e3o mais alinhadas com a filosofia do Spring Data. Elas tamb\u00e9m precisam ser anotadas explicitamente com <code>@View(viewName=\"something\")<\/code>.<\/p>\n<p>Isso significa que nada espec\u00edfico do Couchbase deve vazar para a interface do seu reposit\u00f3rio. Em vez disso, o que voc\u00ea pode fazer \u00e9 usar mecanismos de deriva\u00e7\u00e3o de consultas para a maioria das consultas.<\/p>\n<p>A deriva\u00e7\u00e3o de consultas tamb\u00e9m \u00e9 poss\u00edvel em pequena escala, com algumas palavras-chave sendo aceitas em um m\u00e9todo apoiado em visualiza\u00e7\u00e3o.<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">public interface UserRepository extends Repository&lt;User, String&gt; {\r\n\r\n  @Override\r\n  @View(designDocument = \"user\", viewName = \"customFindAllView\")\r\n  Iterable findAll();\r\n\r\n  @View(viewName = \"customFindByNameView\")\r\n  User findByUsernameIs(String lowKey);\r\n\r\n  @View(viewName = \"customFindByNameView\")\r\n  List findByUsernameBetween(String lowKey, String highKey);\r\n}<\/code><\/pre>\n<\/div>\n<h2 id=\"toc_3\">Usando a fun\u00e7\u00e3o reduce das visualiza\u00e7\u00f5es<\/h2>\n<p>\u2b50<\/p>\n<p>Outra novidade que n\u00e3o era suportada anteriormente \u00e9 a execu\u00e7\u00e3o da fun\u00e7\u00e3o de redu\u00e7\u00e3o, se voc\u00ea tiver uma. Agora, para execut\u00e1-la, basta definir o par\u00e2metro <code>reduzir<\/code> para true no sinalizador <code>@Ver<\/code> anota\u00e7\u00e3o.<\/p>\n<p>Voc\u00ea tamb\u00e9m pode prefixar seu m\u00e9todo com \"count\" em vez de \"find\" se isso for significativo para voc\u00ea (ou seja, se voc\u00ea realmente usar a fun\u00e7\u00e3o de redu\u00e7\u00e3o \"count\").<\/p>\n<p>Observe que a fun\u00e7\u00e3o reduce no Couchbase pode ser algo diferente da fun\u00e7\u00e3o _count preexistente e pode at\u00e9 mesmo retornar algo diferente de um long, como um <code>JsonObject<\/code>, como no caso do built-in <code>_estat\u00edsticas<\/code>.<\/p>\n<p>Da mesma forma, adicionar a varia\u00e7\u00e3o \"topX\" ou \"firstX\" em um nome de m\u00e9todo resultar\u00e1 na defini\u00e7\u00e3o de um limite adicional na solicita\u00e7\u00e3o (por exemplo. <code>findFirst5ByLastName<\/code> limitar\u00e1 a lista a 5 resultados).<\/p>\n<h2 id=\"toc_4\">Configurando a consist\u00eancia, leia seus pr\u00f3prios textos<\/h2>\n<p>\u2b50\u2b50\u2b50<\/p>\n<p>Um aspecto que surge com frequ\u00eancia ao usar \u00edndices secund\u00e1rios preenchidos de forma ass\u00edncrona, como exibi\u00e7\u00f5es e GSI (o novo mecanismo de \u00edndice secund\u00e1rio que d\u00e1 suporte ao N1QL), \u00e9 a necessidade de ler imediatamente as modifica\u00e7\u00f5es de suas opera\u00e7\u00f5es de grava\u00e7\u00e3o anteriores.<\/p>\n<p>Isso implica que a exibi\u00e7\u00e3o\/N1QL n\u00e3o deve responder enquanto os dados ainda estiverem em processo de indexa\u00e7\u00e3o, o que sacrifica um pouco o desempenho em favor da consist\u00eancia.<\/p>\n<p>O oposto (e o padr\u00e3o atual do Spring Data Couchbase) \u00e9 favorecer o desempenho aceitando o retorno de dados obsoletos.<\/p>\n<p>Adicionamos uma sem\u00e2ntica global para configurar todas as consultas (baseadas em visualiza\u00e7\u00e3o ou em N1QL) que s\u00e3o constru\u00eddas pela estrutura por meio da deriva\u00e7\u00e3o de consultas, fornecendo uma pequena abstra\u00e7\u00e3o em torno do conceito de consist\u00eancia.<\/p>\n<p>Isso \u00e9 feito substituindo o <code>AbstractCouchbaseConfiguration<\/code>'s <code>getDefaultConsistency()<\/code> m\u00e9todo. <code>Consist\u00eancia<\/code> \u00e9 um enum que permite que voc\u00ea escolha entre <code>LER_SUAS_PR\u00d3PRIAS_ESCRITAS<\/code>, <code>FORTEMENTE_CONSISTENTE<\/code>, <code>UPDATE_AFTER<\/code> e <code>EVENTUALMENTE_CONSISTENTE<\/code>. Consulte a documenta\u00e7\u00e3o oficial para obter mais informa\u00e7\u00f5es sobre como eles funcionam exatamente e qual \u00e9 o impacto deles no momento da consulta.<\/p>\n<p>Voc\u00ea tamb\u00e9m pode fazer isso em XML usando o atributo de consist\u00eancia no <code><\/code> tag.<\/p>\n<p>Desde o GA, os m\u00e9todos CRUD nos reposit\u00f3rios agora tamb\u00e9m levam em conta a consist\u00eancia configurada por padr\u00e3o.<\/p>\n<h2 id=\"toc_5\">Altera\u00e7\u00e3o do campo de informa\u00e7\u00f5es de tipo no JSON armazenado<\/h2>\n<p>\u2b50<\/p>\n<p>Alguns usu\u00e1rios relataram problemas com o Spring Data e o Couchbase Mobile, com o Sync Gateway rejeitando documentos que cont\u00eam campos prefixados por um sublinhado.<\/p>\n<p>Isso \u00e9 problem\u00e1tico para o Spring Data, pois, por padr\u00e3o, ele armazena as informa\u00e7\u00f5es de tipo em um <code>_classe<\/code> campo :(<\/p>\n<p>A solu\u00e7\u00e3o \u00e9 permitir, por meio da configura\u00e7\u00e3o, modificar o nome do campo de informa\u00e7\u00f5es desse tipo. Voc\u00ea pode fazer isso substituindo o campo <code>typeKey()<\/code> m\u00e9todo em <code>AbstractCouchbaseConfiguration<\/code>. Por exemplo, voc\u00ea pode usar a constante <code>MappingCouchbaseConverter.TYPEKEY_SYNCGATEWAY_COMPATIBLE<\/code> (que \u00e9 \"<code>javaClass<\/code>&#8220;).<\/p>\n<p>Esse campo \u00e9 usado pelas consultas N1QL geradas para filtrar apenas os documentos correspondentes \u00e0 entidade do reposit\u00f3rio.<\/p>\n<h2 id=\"toc_6\">Suporte para <code>Pagin\u00e1vel<\/code>\/<code>Solicita\u00e7\u00e3o de p\u00e1gina<\/code> em consultas derivadas do N1QL<\/h2>\n<p>\u2b50\u2b50<\/p>\n<p>Usando o N1QL, para consultas geradas por meio da deriva\u00e7\u00e3o de consultas, <code>Pagin\u00e1vel<\/code> e <code>Classificar<\/code> agora s\u00e3o compat\u00edveis.<\/p>\n<ul>\n<li>Suporte para <code>PagingAndSortingRepository (Reposit\u00f3rio de pagina\u00e7\u00e3o e classifica\u00e7\u00e3o)<\/code> com base no N1QL.<\/li>\n<li>Adiciona dois <code>findAll<\/code> m\u00e9todos que dependem do N1QL para pagina\u00e7\u00e3o e\/ou classifica\u00e7\u00e3o. Usa a consist\u00eancia configurada padr\u00e3o.<\/li>\n<\/ul>\n<h2 id=\"toc_7\">Consultas geoespaciais e multidimensionais usando visualiza\u00e7\u00f5es espaciais<\/h2>\n<p>\u2b50\u2b50\u2b50<\/p>\n<p>Consultar o Couchbase usando coordenadas! Desde que sua entidade tenha um <code>Ponto<\/code> (ou <code>x<\/code> e <code>y<\/code>), voc\u00ea pode encontr\u00e1-lo usando:<\/p>\n<ul>\n<li>uma caixa delimitadora: <code>findByLocationWithin(Box area)<\/code><\/li>\n<li>um c\u00edrculo: <code>findByLocationWithin(Circle area)<\/code>, <code>findByLocationWithin(Point center, Distance radius)<\/code>.<\/li>\n<li>um pol\u00edgono: <code>findByLocationWithin(Polygon area)<\/code>, <code>findByLocationWithin(Point[] polygon)<\/code>.<\/li>\n<li>uma dist\u00e2ncia <code>findByLocationNear(Point near, Distance maxDistance)<\/code>.<\/li>\n<\/ul>\n<p>As consultas de c\u00edrculos e pol\u00edgonos s\u00e3o realizadas rapidamente como aproxima\u00e7\u00f5es de caixas delimitadoras no servidor e, em seguida, os falsos positivos s\u00e3o eliminados pela estrutura antes de apresentar os resultados.<\/p>\n<p>Voc\u00ea pode aproveitar o aspecto multidimensional do Couchbase Spatial Views para adicionar dimens\u00f5es extras \u00e0s suas consultas (por exemplo, lojas que abrem tarde da noite em uma cidade...).<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">public interface DimensionalPartyRepository extends CrudRepository&lt;Party, String&gt; {\r\n\r\n  @Dimensional(designDocument = \"partyGeo\", spatialViewName = \"byLocation\")\r\n  List findByLocationNear(Point p, Distance d);\r\n\r\n  @Dimensional(designDocument = \"partyGeo\", spatialViewName = \"byLocation\")\r\n  List findByLocationWithin(Box boundingBox);\r\n\r\n  @Dimensional(designDocument = \"partyGeo\", spatialViewName = \"byLocation\")\r\n  List findByLocationWithin(Polygon zone);\r\n  \r\n  @Dimensional(designDocument = \"partyGeo\", spatialViewName = \"byLocationAndAttendees\", dimensions = 3)\r\n  List findByLocationWithinAndAttendeesGreaterThan(Polygon zone, double minAttendees);\r\n}<\/code><\/pre>\n<\/div>\n<p>Observa\u00e7\u00e3o: se quiser reutilizar anota\u00e7\u00f5es, voc\u00ea tamb\u00e9m pode fazer isso (funciona para <code>@Ver<\/code> e <code>@Query<\/code> tamb\u00e9m):<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-java\">public interface DimensionalPartyRepository extends CrudRepository&lt;Party, String&gt; {\r\n\r\n  \/\/define your own meta-annotation\r\n  @Dimensional(designDocument = \"partyGeo\", spatialViewName = \"byLocation\", dimensions = 2)\r\n  @Retention(RetentionPolicy.RUNTIME)\r\n  @interface IndexedByLocation { }\r\n  \r\n  \/\/use it :)\r\n  @IndexedByLocation\r\n  List findByLocationNear(Point p, Distance d);\r\n\r\n  @IndexedByLocation\r\n  List findByLocationWithin(Box boundingBox);\r\n\r\n  @IndexedByLocation\r\n  List findByLocationWithin(Polygon zone);\r\n  \r\n  \/\/here we use a variation with 3 dimensions, so we need to revert to @Dimensional\r\n  @Dimensional(designDocument = \"partyGeo\", spatialViewName = \"byLocationAndAttendees\", dimensions = 3)\r\n  List findByLocationWithinAndAttendeesGreaterThan(Polygon zone, double minAttendees);\r\n}<\/code><\/pre>\n<\/div>\n<h2 id=\"toc_8\">Em linha <code>N1QL<\/code> <code>@Query<\/code> agora tem suporte para SpEL<\/h2>\n<p>\u2b50\u2b50\u2b50<\/p>\n<p>As consultas em linha podem usar a nota\u00e7\u00e3o SpEL para:<\/p>\n<ol>\n<li>garantir que a sele\u00e7\u00e3o e a filtragem corretas sejam aplicadas \u00e0 declara\u00e7\u00e3o para construir e retornar entidades: use <code>#{#n1ql.selectEntity}<\/code> para gerar um <code>SELECT ... FROM ...<\/code> cl\u00e1usula e <code>#{#n1ql.filter}<\/code> no <code>ONDE<\/code> para limitar a consulta \u00e0 entidade correta.<\/li>\n<li>computam valores ou recuperam dados de valores externos do SpEL configurados no contexto do Spring.<\/li>\n<\/ol>\n<h2 id=\"toc_9\">A cria\u00e7\u00e3o dos \u00edndices \"principais\" do reposit\u00f3rio pode ser acionada automaticamente<\/h2>\n<p>\u2b50\u2b50<\/p>\n<p>\u26a0\ufe0f <strong><em>IMPORTANTE: isso \u00e9 considerado um aux\u00edlio durante o desenvolvimento\/testes e n\u00e3o \u00e9 recomendado na produ\u00e7\u00e3o<\/em><\/strong><\/p>\n<p>Para garantir que a indexa\u00e7\u00e3o N1QL das entidades em um determinado reposit\u00f3rio seja ativada em um ambiente de desenvolvimento ou pr\u00e9-produ\u00e7\u00e3o, \u00e9 poss\u00edvel anot\u00e1-lo com <code>@N1qlPrimaryIndexed<\/code> (que permite a consulta de forma livre em todo o balde) e <code>@N1qlSecondaryIndexed<\/code> (que indexar\u00e1 apenas os documentos correspondentes ao tipo de entidade, de forma semelhante \u00e0 cl\u00e1usula WHERE produzida pelo SpEL <code>#{#n1ql.filter}<\/code>).<\/p>\n<p>Al\u00e9m disso, a visualiza\u00e7\u00e3o de apoio para a opera\u00e7\u00e3o CRUD pode ser criada automaticamente ao anotar o reposit\u00f3rio com <code>@ViewIndexed<\/code> (voc\u00ea precisar\u00e1 fornecer o nome do documento de design, que deve corresponder ao nome da classe simples da entidade com a primeira letra em min\u00fascula).<\/p>\n<p>Al\u00e9m disso, esse recurso deve ser ativado por meio da redefini\u00e7\u00e3o da op\u00e7\u00e3o <code>gerenciador de \u00edndice<\/code> feij\u00e3o no <code>AbstractCouchbaseConfiguration<\/code>.<\/p>\n<h2 id=\"toc_10\">Tipos de retorno simples (primitivos e <code>Cordas<\/code>) agora s\u00e3o suportados ao usar uma proje\u00e7\u00e3o de linha \u00fanica<\/h2>\n<p>\u2b50\u2b50<\/p>\n<p>Isso \u00e9 especialmente voltado para consultas N1QL em linha com fun\u00e7\u00f5es de agrega\u00e7\u00e3o como <code>COUNT(*)<\/code>, <code>AVG(campo)<\/code>etc... A consulta deve retornar uma \u00fanica linha com uma \u00fanica proje\u00e7\u00e3o.<\/p>\n<h2 id=\"toc_11\">Suporte a par\u00e2metros nomeados em consultas em linha do N1QL<\/h2>\n<p>\u2b50\u2b50<\/p>\n<p>Use par\u00e2metros nomeados ou par\u00e2metros posicionais, mas n\u00e3o ambos. A sintaxe para par\u00e2metros nomeados \u00e9 <code>$paramName<\/code>exigindo que cada par\u00e2metro do m\u00e9todo seja anotado com <code>@Param(\"paramName\")<\/code>.<\/p>\n<h2 id=\"toc_12\">Outros recursos<\/h2>\n<p>\u2b50<\/p>\n<p>Outros recursos incluem:<\/p>\n<ul>\n<li>Corrigir a nomenclatura de beans para que todos os beans criados pelo Spring Data Couchbase sejam prefixados com \"<code>couchbase<\/code>\", a fim de evitar conflitos com outras lojas.<\/li>\n<li>Agora, h\u00e1 suporte para a altera\u00e7\u00e3o da classe base de todos os reposit\u00f3rios (seguindo o processo documentado na documenta\u00e7\u00e3o comum do Spring Data)<\/li>\n<li>Caso os \u00edndices estejam desatualizados, os documentos exclu\u00eddos s\u00e3o eliminados dos m\u00e9todos de localiza\u00e7\u00e3o no <code>CouchbaseTemplate<\/code><\/li>\n<li>A expira\u00e7\u00e3o pode ser definida em um <code>@Documento<\/code>, como um <code>longo<\/code> + <code>timeUnit<\/code><\/li>\n<\/ul>\n<p>Algumas corre\u00e7\u00f5es de bugs e melhorias em rela\u00e7\u00e3o ao RC1 tamb\u00e9m foram implementadas.<\/p>\n<h2 id=\"toc_13\">Documenta\u00e7\u00e3o<\/h2>\n<p>\u2b50\u2b50\u2b50<\/p>\n<p><a href=\"https:\/\/docs.spring.io\/spring-data\/couchbase\/docs\/2.0.0.RELEASE\/reference\/html\/\">Documenta\u00e7\u00e3o<\/a> tamb\u00e9m foi aprimorado, adicionando exemplos orientados para o Couchbase sobre como adicionar a implementa\u00e7\u00e3o de um m\u00e9todo personalizado a um reposit\u00f3rio, como alterar a classe base de todos os reposit\u00f3rios, como lidar com SpEL em consultas em linha, ...<\/p>\n<h2 id=\"toc_14\">Uma observa\u00e7\u00e3o sobre o Spring Cache<\/h2>\n<p>O <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/couchbase-spring-cache\/\">Spring Cache<\/a> foi movido para fora do reposit\u00f3rio do Spring Data. Ele ainda est\u00e1 l\u00e1 e planejamos aprimor\u00e1-lo. Por enquanto, voc\u00ea pode encontr\u00e1-lo em um Couchbase <a href=\"https:\/\/github.com\/couchbaselabs\/couchbase-spring-cache\">reposit\u00f3rio<\/a> no github, mas em breve ele dever\u00e1 se reintegrar \u00e0 fam\u00edlia oficial de projetos do Spring.<\/p>\n<h2 id=\"toc_15\">Obtendo o Spring Data Couchbase<\/h2>\n<p>Voc\u00ea pode adicionar o seguinte \u00e0 se\u00e7\u00e3o <code>pom.xml<\/code> para obter essa vers\u00e3o do GA (no <code>depend\u00eancias<\/code> se\u00e7\u00e3o:<\/p>\n<div>\n<pre class=\"line-numbers\"><code class=\"language-markup\">&lt;!----&gt;\r\n  \r\n    org.springframework.data\r\n    spring-data-couchbase\r\n    2.0.0.RELEASE\r\n  \r\n&lt;!----&gt;<\/code><\/pre>\n<\/div>\n<p>Esperamos que voc\u00ea goste dessa vers\u00e3o e de todos os novos recursos que ela traz para a mesa. A pr\u00f3xima etapa ser\u00e1 a reinser\u00e7\u00e3o no <code>Funil<\/code> trem de lan\u00e7amento com uma vers\u00e3o <code>2.1<\/code> esperado antes do ver\u00e3o.<\/p>","protected":false},"excerpt":{"rendered":"<p>Spring Data Couchbase 2.0 is a rewrite of the original Spring Data Couchbase 1.4.x connector. It is based on the Couchbase Java 2.2 SDK and makes heavy use of the new query language N1QL (which was introduced in Couchbase Server [&hellip;]<\/p>","protected":false},"author":48,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1818],"tags":[1424,1465],"ppma_author":[9022],"class_list":["post-2162","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java","tag-spring","tag-spring-data"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Announcing Spring Data Couchbase 2.0 RELEASE - The Couchbase Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/spring-data-couchbase-2-0-release\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Announcing Spring Data Couchbase 2.0 RELEASE\" \/>\n<meta property=\"og:description\" content=\"Spring Data Couchbase 2.0 is a rewrite of the original Spring Data Couchbase 1.4.x connector. It is based on the Couchbase Java 2.2 SDK and makes heavy use of the new query language N1QL (which was introduced in Couchbase Server [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/spring-data-couchbase-2-0-release\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-02-10T12:33:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-10-09T14:25:03+00:00\" \/>\n<meta name=\"author\" content=\"Simon Basle, Software Engineer, Pivotal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Simon Basle, Software Engineer, Pivotal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/\"},\"author\":{\"name\":\"Simon Basle, Software Engineer, Pivotal\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1\"},\"headline\":\"Announcing Spring Data Couchbase 2.0 RELEASE\",\"datePublished\":\"2016-02-10T12:33:49+00:00\",\"dateModified\":\"2025-10-09T14:25:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/\"},\"wordCount\":1505,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"spring\",\"spring-data\"],\"articleSection\":[\"Java\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/\",\"name\":\"Announcing Spring Data Couchbase 2.0 RELEASE - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-02-10T12:33:49+00:00\",\"dateModified\":\"2025-10-09T14:25:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Announcing Spring Data Couchbase 2.0 RELEASE\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1\",\"name\":\"Simon Basle, Software Engineer, Pivotal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b2bcd169f85f21cee7b8a0e0c9e7854\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g\",\"caption\":\"Simon Basle, Software Engineer, Pivotal\"},\"description\":\"Simon Basl_ is a Paris-based Software Engineer working in the Spring team at Pivotal. Previously, he worked in the Couchbase Java SDK team. His interests span software design aspects (OOP, design patterns, software architecture), rich clients, what lies beyond code (continuous integration, (D)VCS, best practices), and reactive programming. He is also an editor for the French version of InfoQ.com.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/simon-basle\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Announcing Spring Data Couchbase 2.0 RELEASE - The Couchbase Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/spring-data-couchbase-2-0-release\/","og_locale":"pt_BR","og_type":"article","og_title":"Announcing Spring Data Couchbase 2.0 RELEASE","og_description":"Spring Data Couchbase 2.0 is a rewrite of the original Spring Data Couchbase 1.4.x connector. It is based on the Couchbase Java 2.2 SDK and makes heavy use of the new query language N1QL (which was introduced in Couchbase Server [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/spring-data-couchbase-2-0-release\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-02-10T12:33:49+00:00","article_modified_time":"2025-10-09T14:25:03+00:00","author":"Simon Basle, Software Engineer, Pivotal","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Simon Basle, Software Engineer, Pivotal","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/"},"author":{"name":"Simon Basle, Software Engineer, Pivotal","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1"},"headline":"Announcing Spring Data Couchbase 2.0 RELEASE","datePublished":"2016-02-10T12:33:49+00:00","dateModified":"2025-10-09T14:25:03+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/"},"wordCount":1505,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["spring","spring-data"],"articleSection":["Java"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/","url":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/","name":"Announcing Spring Data Couchbase 2.0 RELEASE - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-02-10T12:33:49+00:00","dateModified":"2025-10-09T14:25:03+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/spring-data-couchbase-2-0-release\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Announcing Spring Data Couchbase 2.0 RELEASE"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/a4086d75b59570cc2e5ff66d98c5d1a1","name":"Simon Basle, engenheiro de software, Pivotal","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/4b2bcd169f85f21cee7b8a0e0c9e7854","url":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","caption":"Simon Basle, Software Engineer, Pivotal"},"description":"Simon Basl_ \u00e9 um engenheiro de software baseado em Paris que trabalha na equipe Spring da Pivotal. Anteriormente, ele trabalhou na equipe do Couchbase Java SDK. Seus interesses abrangem aspectos de design de software (OOP, padr\u00f5es de design, arquitetura de software), clientes avan\u00e7ados, o que est\u00e1 al\u00e9m do c\u00f3digo (integra\u00e7\u00e3o cont\u00ednua, (D)VCS, pr\u00e1ticas recomendadas) e programa\u00e7\u00e3o reativa. Ele tamb\u00e9m \u00e9 editor da vers\u00e3o francesa do InfoQ.com.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/simon-basle\/"}]}},"authors":[{"term_id":9022,"user_id":48,"is_guest":0,"slug":"simon-basle","display_name":"Simon Basle, Software Engineer, Pivotal","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/3c3aec94782fea5f0a199368c15e836198faf05c1591e0ae0b91178a59457781?s=96&d=mm&r=g","author_category":"","last_name":"Basle","first_name":"Simon","job_title":"","user_url":"","description":"Simon Basl_ \u00e9 um engenheiro de software baseado em Paris que trabalha na equipe Spring da Pivotal. Anteriormente, ele trabalhou na equipe do Couchbase Java SDK. Seus interesses abrangem aspectos de design de software (OOP, padr\u00f5es de design, arquitetura de software), clientes avan\u00e7ados, o que est\u00e1 al\u00e9m do c\u00f3digo (integra\u00e7\u00e3o cont\u00ednua, (D)VCS, pr\u00e1ticas recomendadas) e programa\u00e7\u00e3o reativa. Ele tamb\u00e9m \u00e9 editor da vers\u00e3o francesa do InfoQ.com."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2162","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/48"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2162"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2162\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2162"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2162"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2162"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2162"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}