{"id":2168,"date":"2016-05-30T07:54:06","date_gmt":"2016-05-30T07:54:05","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2168"},"modified":"2016-05-30T07:54:06","modified_gmt":"2016-05-30T07:54:05","slug":"vaadin-couchbase-crud-sample","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/vaadin-couchbase-crud-sample\/","title":{"rendered":"Vaadin\/Couchbase CRUD Ejemplo"},"content":{"rendered":"<p>La semana pasada mientras estaba en JFokus conoc\u00ed a <a href=\"https:\/\/twitter.com\/mattitahvonen\">Matti Tahvonen<\/a>trabaja en <a href=\"https:\/\/vaadin.com\/home\">Vaadin<\/a>. Llevan a\u00f1os proponiendo un marco web de c\u00f3digo abierto para aplicaciones ricas de Internet en Java y lo hacen realmente bien. Personalmente estoy muy contento de escribir una aplicaci\u00f3n web moderna completa s\u00f3lo en Java.<\/p>\n<p>Hemos tardado 10 minutos en tener un ejemplo de Vaadin CRUD funcionando almacenando objetos en Couchbase. El resultado est\u00e1 disponible en <a href=\"https:\/\/github.com\/ldoguin\/couchbase-vaadin-spring-data-example\">Github<\/a>. Desde entonces tambi\u00e9n he migrado una muestra basada en JPA tambi\u00e9n disponible <a href=\"https:\/\/github.com\/ldoguin\/spring-data-vaadin-crud\">aqu\u00ed<\/a>. Puedes ver el poco trabajo que requiere y lo f\u00e1cil que es pasar de JPA a Couchbase con la herramienta <a href=\"https:\/\/github.com\/ldoguin\/spring-data-vaadin-crud\/commit\/d811d560d68fc37906b85a49a50fd1512108a001\">dif<\/a>.<\/p>\n<h2>Spring Data Couchbase con Vaadin<\/h2>\n<h3>Generar el proyecto<\/h3>\n<p>El primer paso al iniciar un proyecto Spring es ir a <a href=\"https:\/\/start.spring.io\/\">Inicializaci\u00f3n de muelles<\/a>. Aqu\u00ed puedes seleccionar la versi\u00f3n y las dependencias que quieres para tu proyecto. Selecciona Spring Boot versi\u00f3n 1.4.0(SNAPSHOT) y a\u00f1ade Vaadin y Couchbase como dependencias.<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/february\/vaadin-couchbase-crud-sample\/vaadincouchbasecrud.png\" \/><\/p>\n<p>Ahora puede generar el proyecto e importarlo como un proyecto Maven en el editor de su elecci\u00f3n.<\/p>\n<h3>Persona b\u00e1sica Entidad CRUD<\/h3>\n<p>Este ejemplo CRUD va a almacenar <strong>Cliente<\/strong> objetos. Un cliente tiene un <em>id<\/em>, a <em>firstName<\/em> y un <em>apellido<\/em>. Adem\u00e1s, el apellido no debe ser nulo. Para expresar esto como una entidad, basta con a\u00f1adir el atributo <strong>@Documento<\/strong> en la clase, <strong>@Id<\/strong> en el campo que se utilizar\u00e1 como clave de Couchbase, generar getters y setters y ya est\u00e1. Para expresar las restricciones not null, podemos simplemente usar las anotaciones de validaci\u00f3n de Java <strong>@NotNull.<\/strong> Para asegurarnos de que se recoge al escribir la entidad, tendremos que declarar un bean validador.<\/p>\n<pre>\n<code>package hello;\n\nimport java.util.Objects;\nimport java.util.UUID;\n\nimport javax.validation.constraints.NotNull;\n\nimport org.springframework.data.couchbase.core.mapping.Document;\n\nimport com.couchbase.client.java.repository.annotation.Id;\n\n@Document\npublic class Customer {\n\n    @Id\n    private String id = UUID.randomUUID().toString();\n\n    private String firstName;\n\n    @NotNull\n    private String lastName;\n\n    protected Customer() {\n    }\n\n    public Customer(String firstName, String lastName) {\n        this.firstName = firstName;\n        this.lastName = lastName;\n    }\n\n    public String getId() {\n        return id;\n    }\n\n    public void setId(String id) {\n        this.id = id;\n    }\n\n    public String getFirstName() {\n        return firstName;\n    }\n\n    public void setFirstName(String firstName) {\n        this.firstName = firstName;\n    }\n\n    public String getLastName() {\n        return lastName;\n    }\n\n    public void setLastName(String lastName) {\n        this.lastName = lastName;\n    }\n\n    @Override\n    public String toString() {\n        return String.format(\"Customer[id=%s, firstName=&apos;%s&apos;, lastName=&apos;%s&apos;]\", id, firstName, lastName);\n    }\n\n    @Override\n    public int hashCode() {\n        int hash = 7;\n        hash = 37 * hash + Objects.hashCode(this.id);\n        return hash;\n    }\n\n    @Override\n    public boolean equals(Object obj) {\n        if (this == obj) {\n            return true;\n        }\n        if (obj == null) {\n            return false;\n        }\n        if (getClass() != obj.getClass()) {\n            return false;\n        }\n        final Customer other = (Customer) obj;\n        return Objects.equals(this.id, other.id);\n    }\n\n}\n<\/code><\/pre>\n<h3>Dep\u00f3sito de clientes<\/h3>\n<p>Una vez definida una entidad, hay que crear el repositorio asociado. Cree una interfaz que extienda la interfaz <strong>CouchbasePagingAndSortingRepository<\/strong>. Este repositorio gestiona <strong>Cliente<\/strong> con una cadena como clave.<\/p>\n<p>He redefinido el <em>findAll<\/em> para devolver un <strong>Lista<\/strong> en lugar de un <strong>Iterable<\/strong> ya que funciona mejor con las estructuras de Vaadin. El <em>findAll<\/em> est\u00e1 respaldado por una Vista. Para que sus vistas se definan autom\u00e1ticamente, puede a\u00f1adir el m\u00e9todo<strong> @VerIndexado <\/strong>anotaci\u00f3n. Tambi\u00e9n debe asegurarse de que ha establecido el par\u00e1metro <em>spring.data.couchbase.auto-index<\/em> a true en su <em>aplicaci\u00f3n.propiedades<\/em> archivo.<\/p>\n<p>Tambi\u00e9n he a\u00f1adido un <em>findByLastName(String apellido) <\/em>m\u00e9todo. En funci\u00f3n del nombre del m\u00e9todo, se generar\u00e1 autom\u00e1ticamente la consulta N1QL adecuada. Pero para ejecutar la consulta N1Ql, se necesita un \u00edndice primario. Que tambi\u00e9n se puede generar autom\u00e1ticamente a trav\u00e9s de la <strong>@N1QLPrimaryIndexed<\/strong> anotaci\u00f3n.<\/p>\n<pre>\n<code>package hello;\n\nimport java.util.List;\n\nimport org.springframework.data.couchbase.core.query.N1qlPrimaryIndexed;\nimport org.springframework.data.couchbase.core.query.ViewIndexed;\nimport org.springframework.data.couchbase.repository.CouchbasePagingAndSortingRepository;\n\n@ViewIndexed(designDoc = \"customer\")\n@N1qlPrimaryIndexed\npublic interface CustomerRepository extends CouchbasePagingAndSortingRepository<Customer, String> {\n\n    List<Customer> findAll();\n\n    List<Customer> findByLastName(String lastName);\n\n}\n<\/code><\/pre>\n<h3>Configuraci\u00f3n<\/h3>\n<p>Estoy utilizando spring-boot-starter-data-couchbase. Proporciona autoconfiguraci\u00f3n. Esta autoconfiguraci\u00f3n se puede activar configurando el par\u00e1metro <em>spring.couchbase.bootstrap-hosts<\/em> propiedad. Hasta ahora mi <em>aplicaci\u00f3n.propiedades<\/em> se ve as\u00ed:<\/p>\n<p>\u00a0<\/p>\n<pre>\n<code>spring.couchbase.bootstrap-hosts=localhost\nspring.data.couchbase.auto-index=true\n<\/code><\/pre>\n<p>\u00a0<\/p>\n<h3>Crear un cliente<\/h3>\n<p>Ahora tengo todo lo que necesito para guardar un <strong>Cliente<\/strong> Entity en Couchbase. Podemos probar esto f\u00e1cilmente con un <strong>CommandLineRunner<\/strong>:<\/p>\n<pre>\n<code>@SpringBootApplication\npublic class Application {\n\n    private static final Logger log = LoggerFactory.getLogger(Application.class);\n\n    public static void main(String[] args) {\n        SpringApplication.run(Application.class);\n    }\n\n    @Bean\n    public CommandLineRunner loadData(CustomerRepository repository) {\n        return (args) -> {\n            repository.save(new Customer(null, \"Dessler\"));\n        };\n    }\n\n    @Bean\n    public Validator validator() {\n        return new LocalValidatorFactoryBean();\n    }\n}\n<\/code><\/pre>\n<p>Ver\u00e1s que tambi\u00e9n he a\u00f1adido el bean validador mencionado anteriormente. Utiliza un <strong><a href=\"https:\/\/docs.spring.io\/spring-data\/couchbase\/docs\/current\/api\/index.html?org\/springframework\/data\/couchbase\/core\/mapping\/event\/ValidatingCouchbaseEventListener.html\">ValidatingCouchbaseEventListener<\/a><\/strong> declarado autom\u00e1ticamente por la configuraci\u00f3n autom\u00e1tica de Spring Boot.<\/p>\n<h3>Uso de Vaadin para la interfaz de usuario<\/h3>\n<p>El backend est\u00e1 listo, podemos empezar a pensar en el frontend. Quiero una aplicaci\u00f3n b\u00e1sica CRUD que mostrar\u00e1 una lista de clientes, la posibilidad de a\u00f1adir, editar o eliminar elementos de la lista. Aqu\u00ed&apos;s una captura de pantalla:<\/p>\n<p><img decoding=\"async\" src=\"\/wp-content\/original-assets\/2016\/february\/vaadin-couchbase-crud-sample\/vaadincrudui.png\" \/><\/p>\n<p>Para construir esto empezamos creando un formulario que permita al usuario introducir un nombre y un apellido. Crea una clase que extienda un <strong>Formulario abstracto<\/strong> de <strong>Cliente<\/strong>. Esta clase no est\u00e1 disponible en Vaadin Core, por lo que tenemos que a\u00f1adir <a href=\"https:\/\/vaadin.com\/directory#!addon\/viritin\">Viritin<\/a>.<\/p>\n<blockquote><p>Viritin es una librer\u00eda de mejora del lado del servidor para Vaadin. Corrige algunos defectos en el n\u00facleo del framework y proporciona una API m\u00e1s fluida e inteligente para los componentes existentes. Tambi\u00e9n proporciona varias mejoras importantes para la vinculaci\u00f3n de bases de datos y proporciona componentes completamente nuevos hechos con la composici\u00f3n del lado del servidor (no se necesita widgetset).<\/p><\/blockquote>\n<p>Y s\u00ed proporciona la <strong>Formulario abstracto<\/strong> que est\u00e1 perfectamente integrada con Spring Data y los validadores. Necesitamos editar la clase <em>firstName<\/em> y <em>apellido<\/em> campos del <strong>Cliente<\/strong> por lo que definimos dos campos de texto llamados <em>firstName<\/em> y <em>apellido<\/em>. Deben tener el mismo nombre que su campo Cliente. Lo que tambi\u00e9n es bueno de este componente es que recoger\u00e1 la anotaci\u00f3n de validaci\u00f3n en su entidad. De esta manera se obtiene la validaci\u00f3n autom\u00e1tica en el cliente y en el servidor. Y soporta anotaciones m\u00e1s complejas que el<strong style=\"line-height: 20.8px;\">@NotNull<\/strong><span style=\"line-height: 1.6em;\">\u00a0como <strong>Tama\u00f1o <\/strong>o <strong>@Patr\u00f3n<\/strong>.<\/span><\/p>\n<pre>\n<code>package hello;\n\nimport org.vaadin.viritin.form.AbstractForm;\nimport org.vaadin.viritin.layouts.MFormLayout;\n\nimport com.vaadin.spring.annotation.SpringComponent;\nimport com.vaadin.spring.annotation.UIScope;\nimport com.vaadin.ui.Component;\nimport com.vaadin.ui.TextField;\n\n@SpringComponent\n@UIScope\npublic class CustomerEditor extends AbstractForm<Customer> {\n\n    \/* Fields to edit properties in Customer entity *\/\n    TextField firstName = new TextField(\"First name\");\n    TextField lastName = new TextField(\"Last name\");\n\n    public CustomerEditor() {\n        setVisible(false);\n    }\n\n    @Override\n    protected Component createContent() {\n        return new MFormLayout(firstName, lastName, getToolbar());\n    }\n\n}\n<\/code><\/pre>\n<p>Ahora que el formulario est\u00e1 listo podemos construir la UI completa mostrando la rejilla de la tabla. Este ser\u00e1 el componente principal de su aplicaci\u00f3n Vaadin, la p\u00e1gina web principal. Dado que la <strong>Dep\u00f3sito de clientes<\/strong> y el <strong>ClienteEditor<\/strong> son beans de Spring, podemos inyectarlos directamente en el constructor. Si usted est\u00e1 familiarizado con la escritura de Java UI, el c\u00f3digo comentado a continuaci\u00f3n debe ser sencillo.<\/p>\n<pre>\n<code>package hello;\n\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.vaadin.viritin.fields.MTable;\nimport org.vaadin.viritin.layouts.MVerticalLayout;\n\nimport com.vaadin.annotations.Theme;\nimport com.vaadin.server.FontAwesome;\nimport com.vaadin.server.VaadinRequest;\nimport com.vaadin.spring.annotation.SpringUI;\nimport com.vaadin.ui.Button;\nimport com.vaadin.ui.UI;\n\n@SpringUI\n@Theme(\"valo\")\npublic class VaadinUI extends UI {\n\n    private final CustomerRepository repo;\n\n    private final CustomerEditor editor;\n\n    private final MTable<Customer> grid;\n\n    private final Button addNewBtn;\n\n    @Autowired\n    public VaadinUI(CustomerRepository repo, CustomerEditor editor) {\n        this.repo = repo;\n        this.editor = editor;\n        this.grid = new MTable<>(Customer.class).withProperties(\"id\", \"firstName\", \"lastName\").withHeight(\"300px\");\n        this.addNewBtn = new Button(\"New customer\", FontAwesome.PLUS);\n    }\n\n    @Override\n    protected void init(VaadinRequest request) {\n        \/\/ Connect selected Customer to editor or hide if none is selected\n        grid.addMValueChangeListener(e -> {\n            if (e.getValue() == null) {\n                editor.setVisible(false);\n            } else {\n                editor.setEntity(e.getValue());\n            }\n        });\n\n        \/\/ Instantiate and edit new Customer the new button is clicked\n        addNewBtn.addClickListener(e -> editor.setEntity(new Customer(\"\", \"\")));\n\n        \/\/ Listen changes made by the editor, refresh data from backend\n        editor.setSavedHandler(customer -> {\n            repo.save(customer);\n            listCustomers();\n            editor.setVisible(false);\n        });\n\n        editor.setResetHandler(customer -> {\n            editor.setVisible(false);\n            listCustomers();\n        });\n\n        editor.setDeleteHandler(customer -> {\n            repo.delete(customer);\n            listCustomers();\n        });\n\n        \/\/ Initialize listing\n        listCustomers();\n\n        \/\/ build layout\n            setContent(new MVerticalLayout(addNewBtn, grid, editor));\n        }\n\n        private void listCustomers() {\n            grid.setBeans(repo.findAll());\n        }\n\n    }\n<\/code><\/pre>\n<p>Y entonces usted est\u00e1 todo listo, todo lo que tienes que hacer es ejecutar esto como una aplicaci\u00f3n Java Spring Boot habitual.  As\u00ed que fue bastante f\u00e1cil \u00bfeh?<\/p>","protected":false},"excerpt":{"rendered":"<p>Last week while I was at JFokus I met Matti Tahvonen, he works at Vaadin. They have been proposing an open source web framework for rich Internet applications in Java for years and do it really well. I am personally [&hellip;]<\/p>","protected":false},"author":49,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1818],"tags":[1595,1594],"ppma_author":[9023],"class_list":["post-2168","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-java","tag-spring-data-couchbase","tag-vaadin"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v26.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Vaadin\/Couchbase CRUD Sample - 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\/es\/vaadin-couchbase-crud-sample\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vaadin\/Couchbase CRUD Sample\" \/>\n<meta property=\"og:description\" content=\"Last week while I was at JFokus I met Matti Tahvonen, he works at Vaadin. They have been proposing an open source web framework for rich Internet applications in Java for years and do it really well. I am personally [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/vaadin-couchbase-crud-sample\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-05-30T07:54:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Laurent Doguin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ldoguin\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"unstructured.io\" \/>\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\/vaadin-couchbase-crud-sample\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/\"},\"author\":{\"name\":\"Laurent Doguin\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\"},\"headline\":\"Vaadin\/Couchbase CRUD Sample\",\"datePublished\":\"2016-05-30T07:54:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/\"},\"wordCount\":820,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"spring-data-couchbase\",\"vaadin\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Java\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/\",\"name\":\"Vaadin\/Couchbase CRUD Sample - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-05-30T07:54:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#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\/vaadin-couchbase-crud-sample\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vaadin\/Couchbase CRUD Sample\"}]},{\"@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\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\/c0aa9b8f1ed51b7a9e2f7cb755994a5e\",\"name\":\"Laurent Doguin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g\",\"caption\":\"Laurent Doguin\"},\"description\":\"Laurent is a nerdy metal head who lives in Paris. He mostly writes code in Java and structured text in AsciiDoc, and often talks about data, reactive programming and other buzzwordy stuff. He is also a former Developer Advocate for Clever Cloud and Nuxeo where he devoted his time and expertise to helping those communities grow bigger and stronger. He now runs Developer Relations at Couchbase.\",\"sameAs\":[\"https:\/\/x.com\/ldoguin\"],\"honorificPrefix\":\"Mr\",\"birthDate\":\"1985-06-07\",\"gender\":\"male\",\"award\":[\"Devoxx Champion\",\"Couchbase Legend\"],\"knowsAbout\":[\"Java\"],\"knowsLanguage\":[\"English\",\"French\"],\"jobTitle\":\"Director Developer Relation & Strategy\",\"worksFor\":\"Couchbase\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/laurent-doguin\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Vaadin\/Couchbase CRUD Sample - 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\/es\/vaadin-couchbase-crud-sample\/","og_locale":"es_MX","og_type":"article","og_title":"Vaadin\/Couchbase CRUD Sample","og_description":"Last week while I was at JFokus I met Matti Tahvonen, he works at Vaadin. They have been proposing an open source web framework for rich Internet applications in Java for years and do it really well. I am personally [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/es\/vaadin-couchbase-crud-sample\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-05-30T07:54:05+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Laurent Doguin","twitter_card":"summary_large_image","twitter_creator":"@ldoguin","twitter_misc":{"Written by":"unstructured.io","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/"},"author":{"name":"Laurent Doguin","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/c0aa9b8f1ed51b7a9e2f7cb755994a5e"},"headline":"Vaadin\/Couchbase CRUD Sample","datePublished":"2016-05-30T07:54:05+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/"},"wordCount":820,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["spring-data-couchbase","vaadin"],"articleSection":["Best Practices and Tutorials","Java"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/","url":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/","name":"Vaadin\/Couchbase CRUD Sample - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-05-30T07:54:05+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/vaadin-couchbase-crud-sample\/#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\/vaadin-couchbase-crud-sample\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Vaadin\/Couchbase CRUD Sample"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos 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":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@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\/c0aa9b8f1ed51b7a9e2f7cb755994a5e","name":"Laurent Doguin","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/12929ce99397769f362b7a90d6b85071","url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","caption":"Laurent Doguin"},"description":"Laurent es un metalero empoll\u00f3n que vive en Par\u00eds. Principalmente escribe c\u00f3digo en Java y texto estructurado en AsciiDoc, y a menudo habla sobre datos, programaci\u00f3n reactiva y otras cosas de moda. Tambi\u00e9n fue Developer Advocate de Clever Cloud y Nuxeo, donde dedic\u00f3 su tiempo y experiencia a ayudar a esas comunidades a crecer y fortalecerse. Ahora dirige las relaciones con los desarrolladores en Couchbase.","sameAs":["https:\/\/x.com\/ldoguin"],"honorificPrefix":"Mr","birthDate":"1985-06-07","gender":"male","award":["Devoxx Champion","Couchbase Legend"],"knowsAbout":["Java"],"knowsLanguage":["English","French"],"jobTitle":"Director Developer Relation & Strategy","worksFor":"Couchbase","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/laurent-doguin\/"}]}},"authors":[{"term_id":9023,"user_id":49,"is_guest":0,"slug":"laurent-doguin","display_name":"Laurent Doguin","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/b8c466908092b46634af916b6921f30187a051e4367ded7ac9b1a3f2c5692fd2?s=96&d=mm&r=g","author_category":"","last_name":"Doguin","first_name":"Laurent","job_title":"","user_url":"","description":"Laurent es un metalero empoll\u00f3n que vive en Par\u00eds. Principalmente escribe c\u00f3digo en Java y texto estructurado en AsciiDoc, y a menudo habla sobre datos, programaci\u00f3n reactiva y otras cosas de moda. Tambi\u00e9n fue Developer Advocate de Clever Cloud y Nuxeo, donde dedic\u00f3 su tiempo y experiencia a ayudar a esas comunidades a crecer y fortalecerse. Ahora dirige las relaciones con los desarrolladores en Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2168","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/49"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=2168"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2168\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=2168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2168"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}