{"id":5497,"date":"2024-06-17T11:13:53","date_gmt":"2024-06-17T09:13:53","guid":{"rendered":"https:\/\/www.aiknow.io\/liquibase-jpa-buddy-a-winning-combination\/"},"modified":"2024-06-17T11:13:53","modified_gmt":"2024-06-17T09:13:53","slug":"liquibase-jpa-buddy-a-winning-combination","status":"publish","type":"post","link":"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/","title":{"rendered":"Liquibase + JPA Buddy: A Winning Combination"},"content":{"rendered":"<h2><span style=\"font-weight: 400;\">Liquibase + JPA Buddy: the problem they solve<\/span><\/h2>\n<p>A common problem in many projects and frameworks is the management of database structure changes during the life of a project. Reduced to the bare minimum, this problem can be formulated as follows: How can I automate the update of a database based on changes made to project entities?<\/p>\n<p>Let us see how this problem can be solved in a Spring Boot project without having to write SQL scripts and execute them manually. We base this tutorial on <a href=\"https:\/\/jpa-buddy.com\/\" target=\"_blank\" rel=\"noopener\">JPA Buddy<\/a>, which integrates with IntelliJ IDEA.<\/p>\n<p>We must then install the IntelliJ IDEA JPA Buddy plugin. In addition, it is necessary to have the Ultimate version of IntelliJ IDEA.<\/p>\n<p>We start with a Spring Boot project. In our case, the basic project is a demo implementation of a Sparkplug primary host: a Spring Boot application implementing the basis of the <a href=\"https:\/\/sparkplug.eclipse.org\/specification\/\" target=\"_blank\" rel=\"noopener\">Sparkplug<\/a> B v1.0 specification.<\/p>\n<p>The detail of the application here is irrelevant; suffice it to say that it connects to a PostgreSQL database called <em>sparkplugdemo<\/em>.<\/p>\n<p>We add the Liquibase dependency to the pom.xml:<\/p>\n<p><img decoding=\"async\" class=\"aligncenter size-full wp-image-5439\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/liquibase-dipendenza1.jpg\" alt=\"\" width=\"405\" height=\"88\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/liquibase-dipendenza1.jpg 405w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/liquibase-dipendenza1-300x65.jpg 300w\" sizes=\"(max-width: 405px) 100vw, 405px\" \/><\/p>\n<p>In the src\/main\/resources directory we create db\/changelog and here a file db.changelog-master.xml. The initial content of the file must be:<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"aligncenter size-full wp-image-5441\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/liquibase-dipendenza2.jpg\" alt=\"\" width=\"584\" height=\"165\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/liquibase-dipendenza2.jpg 584w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/liquibase-dipendenza2-300x85.jpg 300w\" sizes=\"(max-width: 584px) 100vw, 584px\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Let us now add the reference to Liquibase in the Spring Boot application.properties file:<\/p>\n<p><code>spring.liquibase.change-log=classpath:\/db\/changelog\/db.changelog-master.xml<br \/>\nspring.liquibase.enabled=true<br \/>\nspring.liquibase.url=jdbc:postgresql:\/\/localhost:5431\/sparkplugdemo<br \/>\nspring.liquibase.user=[DATABASE_USER]<br \/>\nspring.liquibase.password=[DATABASE_PASSWORD]<\/code><\/p>\n<p>In the previous property block, we specify for Liquibase the master changelog file, which in our case is in XML format, and the database connection parameters to be updated by Liquibase.<br \/>\nThis way, when the application starts up, it verifies that the database to which it is to connect is correctly updated by a changelog history table. If new changes have been made to the database structure, Liquibase will automatically perform the updates indicated in the various changelogs that have not yet been applied.<\/p>\n<p>Cos\u00ec appare il file con il suo contenuto inizialmente. Afterwards, there will be no need to edit this file manually: JPA Buddy will do it for us.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-5443 size-large\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-3-1024x286.png\" alt=\"\" width=\"1024\" height=\"286\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-3-1024x286.png 1024w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-3-300x84.png 300w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-3-768x215.png 768w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-3-1536x430.png 1536w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-3-2048x573.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>Let us now open the screen of the JPA Buddy plugin (found under the name JPA Explorer).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5445 size-large\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-4-1024x899.png\" alt=\"\" width=\"1024\" height=\"899\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-4-1024x899.png 1024w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-4-300x263.png 300w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-4-768x674.png 768w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-4-1536x1348.png 1536w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-4.png 1586w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>From here we can select the +.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5447 size-large\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-5-1024x363.png\" alt=\"\" width=\"1024\" height=\"363\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-5-1024x363.png 1024w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-5-300x106.png 300w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-5-768x272.png 768w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-5-1536x545.png 1536w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-5.png 1962w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>We then choose the option Init Changelog.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5449 size-large\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-6-816x1024.png\" alt=\"\" width=\"816\" height=\"1024\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-6-816x1024.png 816w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-6-239x300.png 239w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-6-768x963.png 768w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-6-1224x1536.png 1224w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-6.png 1250w\" sizes=\"(max-width: 816px) 100vw, 816px\" \/><\/p>\n<p>We use the model as source and configure the database type.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5451 size-large\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-7-1024x367.png\" alt=\"\" width=\"1024\" height=\"367\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-7-1024x367.png 1024w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-7-300x107.png 300w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-7-768x275.png 768w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-7-1536x550.png 1536w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-7-2048x733.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>A changelog file will be generated, then a screen similar to the following will appear.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-5453\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-8-1024x733.png\" alt=\"\" width=\"1024\" height=\"733\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-8-1024x733.png 1024w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-8-300x215.png 300w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-8-768x550.png 768w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-8-1536x1100.png 1536w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-8-2048x1467.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>Change the directory and file name. This step is optional; it is important to configure the inclusion of the changelog in the master file created at the beginning, as seen below under <strong>Include to<\/strong>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5455 size-large\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-9-1024x730.png\" alt=\"\" width=\"1024\" height=\"730\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-9-1024x730.png 1024w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-9-300x214.png 300w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-9-768x548.png 768w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-9-1536x1096.png 1536w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-9-2048x1461.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>The directory with the changelog file will then be generated:<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-5487\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-15-ok-1024x506.png\" alt=\"\" width=\"1024\" height=\"506\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-15-ok-1024x506.png 1024w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-15-ok-300x148.png 300w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-15-ok-768x380.png 768w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-15-ok.png 1210w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>The file db.changelog-master.xml will automatically include the new changelog. There is no need to do it by hand.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-5489\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-16-ok-1024x312.png\" alt=\"\" width=\"1024\" height=\"312\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-16-ok-1024x312.png 1024w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-16-ok-300x91.png 300w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-16-ok-768x234.png 768w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-16-ok-1536x468.png 1536w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-16-ok-2048x624.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>Our changelog will contain something like the following:<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-5491\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-17-1024x736.png\" alt=\"\" width=\"1024\" height=\"736\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-17-1024x736.png 1024w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-17-300x216.png 300w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-17-768x552.png 768w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-17.png 1122w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>We now apply the changes to the database by returning to the JPA Buddy plugin screen and selecting the icon corresponding to the update.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5457 size-large\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-11-1024x736.png\" alt=\"liquibase \" width=\"1024\" height=\"736\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-11-1024x736.png 1024w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-11-300x216.png 300w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-11-768x552.png 768w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-11.png 1130w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>We will be prompted for the database connection to be updated. Obviously, the database must be present (even if empty). Let us therefore create it before doing so.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-5459\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-12-1024x389.png\" alt=\"\" width=\"1024\" height=\"389\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-12-1024x389.png 1024w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-12-300x114.png 300w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-12-768x292.png 768w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-12-1536x583.png 1536w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-12-2048x778.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>After the update, we will see a success message.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-5461\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-13-1024x484.png\" alt=\"\" width=\"1024\" height=\"484\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-13-1024x484.png 1024w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-13-300x142.png 300w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-13-768x363.png 768w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-13-1536x726.png 1536w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-13-2048x967.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>If we now modify the entities in our project, it will be sufficient to generate a difference changelog from the JPA plugin, as can be seen in the following screenshot.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-5463 size-large\" src=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-14-842x1024.png\" alt=\"liquibase\" width=\"842\" height=\"1024\" srcset=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-14-842x1024.png 842w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-14-247x300.png 247w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-14-768x934.png 768w, https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-14.png 1256w\" sizes=\"(max-width: 842px) 100vw, 842px\" \/><\/p>\n<p>Thanks for following this little tutorial, if you still are &#8216;thirsty&#8217; for tech-pills, don&#8217;t miss a single topic on our <a href=\"https:\/\/www.aiknow.io\/en\/blog-aiknow\/\">blog<\/a>!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Liquibase + JPA Buddy: the problem they solve A common problem in many projects and frameworks is the management of database structure changes during the life of a project. Reduced to the bare minimum, this problem can be formulated as follows: How can I automate the update of a database based on changes made to [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":5495,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"default","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[29],"tags":[],"class_list":["post-5497","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech-news-en"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Liquibase + JPA Buddy: A Winning Combination - AIknow<\/title>\n<meta name=\"description\" content=\"A common problem in many projects and frameworks is the management of database structure changes during the life of a project.\" \/>\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.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Liquibase + JPA Buddy: A Winning Combination - AIknow\" \/>\n<meta property=\"og:description\" content=\"A common problem in many projects and frameworks is the management of database structure changes during the life of a project.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/\" \/>\n<meta property=\"og:site_name\" content=\"AIknow\" \/>\n<meta property=\"article:published_time\" content=\"2024-06-17T09:13:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-jpa-buddy-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"800\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Angelo Lazzari\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Angelo Lazzari\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/\"},\"author\":{\"name\":\"Angelo Lazzari\",\"@id\":\"https:\/\/www.aiknow.io\/#\/schema\/person\/c0e4c357cf11bfbe3d06457f01e56330\"},\"headline\":\"Liquibase + JPA Buddy: A Winning Combination\",\"datePublished\":\"2024-06-17T09:13:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/\"},\"wordCount\":581,\"publisher\":{\"@id\":\"https:\/\/www.aiknow.io\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-jpa-buddy-logo.jpg\",\"articleSection\":[\"Tech news\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/\",\"url\":\"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/\",\"name\":\"Liquibase + JPA Buddy: A Winning Combination - AIknow\",\"isPartOf\":{\"@id\":\"https:\/\/www.aiknow.io\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-jpa-buddy-logo.jpg\",\"datePublished\":\"2024-06-17T09:13:53+00:00\",\"description\":\"A common problem in many projects and frameworks is the management of database structure changes during the life of a project.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/#primaryimage\",\"url\":\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-jpa-buddy-logo.jpg\",\"contentUrl\":\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-jpa-buddy-logo.jpg\",\"width\":800,\"height\":800},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.aiknow.io\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Liquibase + JPA Buddy: A Winning Combination\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.aiknow.io\/#website\",\"url\":\"https:\/\/www.aiknow.io\/\",\"name\":\"AIknow - Developing future\",\"description\":\"From Edge To Intelligence\",\"publisher\":{\"@id\":\"https:\/\/www.aiknow.io\/#organization\"},\"alternateName\":\"AIknow\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.aiknow.io\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.aiknow.io\/#organization\",\"name\":\"AIknow - Developing future\",\"url\":\"https:\/\/www.aiknow.io\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.aiknow.io\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2018\/06\/aiknow-logo_03.png\",\"contentUrl\":\"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2018\/06\/aiknow-logo_03.png\",\"width\":1596,\"height\":348,\"caption\":\"AIknow - Developing future\"},\"image\":{\"@id\":\"https:\/\/www.aiknow.io\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.aiknow.io\/#\/schema\/person\/c0e4c357cf11bfbe3d06457f01e56330\",\"name\":\"Angelo Lazzari\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.aiknow.io\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/73911066d673686613427bebead5a60c01979853c9864201f1190d35e7bc2018?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/73911066d673686613427bebead5a60c01979853c9864201f1190d35e7bc2018?s=96&d=mm&r=g\",\"caption\":\"Angelo Lazzari\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Liquibase + JPA Buddy: A Winning Combination - AIknow","description":"A common problem in many projects and frameworks is the management of database structure changes during the life of a project.","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.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/","og_locale":"en_US","og_type":"article","og_title":"Liquibase + JPA Buddy: A Winning Combination - AIknow","og_description":"A common problem in many projects and frameworks is the management of database structure changes during the life of a project.","og_url":"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/","og_site_name":"AIknow","article_published_time":"2024-06-17T09:13:53+00:00","og_image":[{"width":800,"height":800,"url":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-jpa-buddy-logo.jpg","type":"image\/jpeg"}],"author":"Angelo Lazzari","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Angelo Lazzari","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/#article","isPartOf":{"@id":"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/"},"author":{"name":"Angelo Lazzari","@id":"https:\/\/www.aiknow.io\/#\/schema\/person\/c0e4c357cf11bfbe3d06457f01e56330"},"headline":"Liquibase + JPA Buddy: A Winning Combination","datePublished":"2024-06-17T09:13:53+00:00","mainEntityOfPage":{"@id":"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/"},"wordCount":581,"publisher":{"@id":"https:\/\/www.aiknow.io\/#organization"},"image":{"@id":"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/#primaryimage"},"thumbnailUrl":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-jpa-buddy-logo.jpg","articleSection":["Tech news"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/","url":"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/","name":"Liquibase + JPA Buddy: A Winning Combination - AIknow","isPartOf":{"@id":"https:\/\/www.aiknow.io\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/#primaryimage"},"image":{"@id":"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/#primaryimage"},"thumbnailUrl":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-jpa-buddy-logo.jpg","datePublished":"2024-06-17T09:13:53+00:00","description":"A common problem in many projects and frameworks is the management of database structure changes during the life of a project.","breadcrumb":{"@id":"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/#primaryimage","url":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-jpa-buddy-logo.jpg","contentUrl":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2024\/06\/aiknow-liquibase-jpa-buddy-logo.jpg","width":800,"height":800},{"@type":"BreadcrumbList","@id":"https:\/\/www.aiknow.io\/en\/liquibase-jpa-buddy-a-winning-combination\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.aiknow.io\/en\/"},{"@type":"ListItem","position":2,"name":"Liquibase + JPA Buddy: A Winning Combination"}]},{"@type":"WebSite","@id":"https:\/\/www.aiknow.io\/#website","url":"https:\/\/www.aiknow.io\/","name":"AIknow - Developing future","description":"From Edge To Intelligence","publisher":{"@id":"https:\/\/www.aiknow.io\/#organization"},"alternateName":"AIknow","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.aiknow.io\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.aiknow.io\/#organization","name":"AIknow - Developing future","url":"https:\/\/www.aiknow.io\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.aiknow.io\/#\/schema\/logo\/image\/","url":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2018\/06\/aiknow-logo_03.png","contentUrl":"https:\/\/www.aiknow.io\/wpvt\/wp-content\/uploads\/2018\/06\/aiknow-logo_03.png","width":1596,"height":348,"caption":"AIknow - Developing future"},"image":{"@id":"https:\/\/www.aiknow.io\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.aiknow.io\/#\/schema\/person\/c0e4c357cf11bfbe3d06457f01e56330","name":"Angelo Lazzari","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.aiknow.io\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/73911066d673686613427bebead5a60c01979853c9864201f1190d35e7bc2018?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/73911066d673686613427bebead5a60c01979853c9864201f1190d35e7bc2018?s=96&d=mm&r=g","caption":"Angelo Lazzari"}}]}},"_links":{"self":[{"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/posts\/5497","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/comments?post=5497"}],"version-history":[{"count":0,"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/posts\/5497\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/media\/5495"}],"wp:attachment":[{"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/media?parent=5497"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/categories?post=5497"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.aiknow.io\/en\/wp-json\/wp\/v2\/tags?post=5497"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}