{"id":3704,"date":"2026-04-20T09:29:52","date_gmt":"2026-04-20T13:29:52","guid":{"rendered":"https:\/\/www.mymiller.name\/wordpress\/?p=3704"},"modified":"2026-04-20T09:29:52","modified_gmt":"2026-04-20T13:29:52","slug":"mastering-location-data-with-spring-jpa-a-comprehensive-guide","status":"publish","type":"post","link":"https:\/\/www.mymiller.name\/wordpress\/spring_databases\/mastering-location-data-with-spring-jpa-a-comprehensive-guide\/","title":{"rendered":"Mastering Location Data with Spring JPA: A Comprehensive Guide"},"content":{"rendered":"\n<div class=\"wp-block-jetpack-markdown\"><p>In today\u2019s interconnected world, location data plays a pivotal role in numerous applications, from e-commerce and logistics to travel and social networking. Efficiently managing and accessing this wealth of geographical information is crucial for developers. This article delves into the realm of location data management using Spring JPA (Java Persistence API), a powerful framework for object-relational mapping in Java applications.<\/p>\n<p>We\u2019ll embark on a journey to build a robust Spring service capable of handling intricate location data, encompassing countries, states, and cities. Our focus will be on structuring JPA entities, crafting repositories for seamless data access, and implementing a service layer to orchestrate the loading and retrieval of location information.<\/p>\n<p>The data should be loaded using the following URL: <a href=\"https:\/\/raw.githubusercontent.com\/dr5hn\/countries-states-cities-database\/master\/countries%2Bstates%2Bcities.json\">https:\/\/raw.githubusercontent.com\/dr5hn\/countries-states-cities-database\/master\/countries%2Bstates%2Bcities.json<\/a>, or a similar URL adhering to the same data schema. This loading process should be incorporated within a change set in your application to avoid redundant data loading attempts.<\/p>\n<p><strong>1. Entities<\/strong><\/p>\n<ul>\n<li><strong>Country.java<\/strong><\/li>\n<\/ul>\n<pre><code class=\"language-java\">import javax.persistence.*;\nimport java.util.List;\n\n@Entity\npublic class Country {\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    private Long id;\n\n    private String name;\n    private String iso3;\n    private String iso2;\n    private String numericCode;\n    private String phoneCode;\n    private String capital;\n    private String currency;\n    private String currencyName;\n    private String currencySymbol;\n    private String tld;\n    private String nativeName;\n    private String region;\n    private String regionId;\n    private String subregion;\n    private String subregionId;\n    private String nationality;\n    \n    @OneToMany(mappedBy = &quot;country&quot;, cascade = CascadeType.ALL, orphanRemoval = true)\n    private List&lt;Timezone&gt; timezones;\n\n    @Embedded \n    private Translations translations;\n\n    private String latitude;\n    private String longitude;\n    private String emoji;\n    private String emojiU;\n\n    @OneToMany(mappedBy = &quot;country&quot;, cascade = CascadeType.ALL, orphanRemoval = true)\n    private List&lt;State&gt; states;\n\n    \/\/ Getters and setters for all attributes\n}\n<\/code><\/pre>\n<ul>\n<li><strong>State.java<\/strong><\/li>\n<\/ul>\n<pre><code class=\"language-java\">import javax.persistence.*;\nimport java.util.List;\n\n@Entity\npublic class State {\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    private Long id;\n\n    private String name;\n    private String stateCode;\n    private String latitude;\n    private String longitude;\n    private String type;\n\n    @ManyToOne\n    @JoinColumn(name = &quot;country_id&quot;) \n    private Country country;\n\n    @OneToMany(mappedBy = &quot;state&quot;, cascade = CascadeType.ALL, orphanRemoval = true)\n    private List&lt;City&gt; cities;\n\n    \/\/ Getters and setters\n}\n<\/code><\/pre>\n<ul>\n<li><strong>City.java<\/strong><\/li>\n<\/ul>\n<pre><code class=\"language-java\">import javax.persistence.*;\n\n@Entity\npublic class City {\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    private Long id;\n\n    private String name;\n    private String latitude;\n    private String longitude;\n\n    @ManyToOne\n    @JoinColumn(name = &quot;state_id&quot;)\n    private State state;\n\n    \/\/ Getters and setters\n}\n<\/code><\/pre>\n<ul>\n<li><strong>Timezone.java<\/strong><\/li>\n<\/ul>\n<pre><code class=\"language-java\">import javax.persistence.*;\n\n@Entity\npublic class Timezone {\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    private Long id;\n\n    private String zoneName;\n    private int gmtOffset;\n    private String gmtOffsetName;\n    private String abbreviation;\n    private String tzName;\n\n    @ManyToOne\n    @JoinColumn(name = &quot;country_id&quot;) \n    private Country country;\n\n    \/\/ Getters and setters\n}\n<\/code><\/pre>\n<ul>\n<li><strong>Translations.java<\/strong><\/li>\n<\/ul>\n<pre><code class=\"language-java\">import javax.persistence.Embeddable;\n\n@Embeddable\npublic class Translations {\n    private String kr;\n    private String ptBR;\n    private String pt;\n    private String nl;\n    private String hr;\n    private String fa;\n    private String de;\n    private String es;\n    private String fr;\n    private String ja;\n    private String it;\n    private String cn;\n    private String tr;\n    private String ru;\n    private String uk;\n    private String pl;\n\n    \/\/ Getters and setters\n}\n<\/code><\/pre>\n<p><strong>2. Repositories<\/strong><\/p>\n<ul>\n<li><strong>CountryRepository.java<\/strong><\/li>\n<\/ul>\n<pre><code class=\"language-java\">import org.springframework.data.jpa.repository.JpaRepository;\nimport org.springframework.stereotype.Repository;\n\nimport java.util.List;\n\n@Repository\npublic interface CountryRepository extends JpaRepository&lt;Country, Long&gt; {\n    List&lt;Country&gt; findByRegion(String region);\n}\n<\/code><\/pre>\n<ul>\n<li><strong>StateRepository.java<\/strong><\/li>\n<\/ul>\n<pre><code class=\"language-java\">import org.springframework.data.jpa.repository.JpaRepository;\nimport org.springframework.stereotype.Repository;\n\nimport java.util.List;\n\n@Repository\npublic interface StateRepository extends JpaRepository&lt;State, Long&gt; {\n    List&lt;State&gt; findByCountryId(Long countryId);\n}\n<\/code><\/pre>\n<ul>\n<li><strong>CityRepository.java<\/strong><\/li>\n<\/ul>\n<pre><code class=\"language-java\">import org.springframework.data.jpa.repository.JpaRepository;\nimport org.springframework.stereotype.Repository;\n\nimport java.util.List;\n\n@Repository\npublic interface CityRepository extends JpaRepository&lt;City, Long&gt; {\n    List&lt;City&gt; findByStateId(Long stateId);\n}\n<\/code><\/pre>\n<p><strong>3. Service<\/strong><\/p>\n<ul>\n<li><strong>LocationService.java<\/strong><\/li>\n<\/ul>\n<pre><code class=\"language-java\">import com.fasterxml.jackson.databind.ObjectMapper;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\nimport org.springframework.web.client.RestTemplate;\n\nimport java.io.IOException;\nimport java.util.List;\n\n@Service\npublic class LocationService {\n\n    @Autowired\n    private CountryRepository countryRepository;\n\n    @Autowired\n    private StateRepository stateRepository;\n\n    @Autowired\n    private CityRepository cityRepository;\n\n    @Autowired\n    private RestTemplate restTemplate; \n\n    public void load(String url) {\n        try {\n            \/\/ 1. Fetch JSON from URL\n            String jsonData = restTemplate.getForObject(url, String.class);\n\n            \/\/ 2. Deserialize JSON into Java objects\n            ObjectMapper objectMapper = new ObjectMapper();\n            List&lt;Country&gt; countries = objectMapper.readValue(jsonData, \n                                            objectMapper.getTypeFactory().constructCollectionType(List.class, Country.class));\n\n            \/\/ 3. Save to the database\n            countryRepository.saveAll(countries);\n\n        } catch (IOException e) {\n            \/\/ Handle JSON parsing exceptions\n            e.printStackTrace(); \n        }\n    }\n\n    public List&lt;Country&gt; getCountries() {\n        return countryRepository.findAll();\n    }\n\n    public List&lt;State&gt; getStatesByCountry(Long countryId) {\n        return stateRepository.findByCountryId(countryId);\n    }\n\n    public List&lt;City&gt; getCitiesByState(Long stateId) {\n        return cityRepository.findByStateId(stateId);\n    }\n\n    public List&lt;Country&gt; getCountriesByRegion(String region) {\n        return countryRepository.findByRegion(region);\n    }\n}\n<\/code><\/pre>\n<p><strong>Integration into a Spring Boot Project<\/strong><\/p>\n<ol>\n<li>\n<p><strong>Place these files:<\/strong><\/p>\n<ul>\n<li>Place the entity classes (<code>Country.java<\/code>, <code>State.java<\/code>, <code>City.java<\/code>, <code>Timezone.java<\/code>, <code>Translations.java<\/code>) in your project\u2019s <code>src\/main\/java\/...\/model<\/code> directory.<\/li>\n<li>Place the repository interfaces (<code>CountryRepository.java<\/code>, <code>StateRepository.java<\/code>, <code>CityRepository.java<\/code>) in your project\u2019s <code>src\/main\/java\/...\/repository<\/code> directory.<\/li>\n<li>Place the service class (<code>LocationService.java<\/code>) in your project\u2019s <code>src\/main\/java\/...\/service<\/code> directory.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>Configure Spring Data JPA:<\/strong><\/p>\n<ul>\n<li>Ensure you have Spring Data JPA dependency in your <code>pom.xml<\/code> or <code>build.gradle<\/code>.<\/li>\n<li>Configure your database connection properties in your <code>application.properties<\/code> or <code>application.yml<\/code>.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p><strong>Use the <code>LocationService<\/code>:<\/strong><\/p>\n<ul>\n<li>Autowire the <code>LocationService<\/code> into your controller or other components.<\/li>\n<li>Call the <code>load<\/code> method to populate the database from the JSON URL.<\/li>\n<li>Use the other methods (<code>getCountries<\/code>, <code>getStatesByCountry<\/code>, etc.) to retrieve data as needed.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><strong>Example Usage in a Controller<\/strong><\/p>\n<pre><code class=\"language-java\">import org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PathVariable;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.List;\n\n@RestController\npublic class LocationController {\n\n    @Autowired\n    private LocationService locationService;\n\n    @GetMapping(&quot;\/load-data&quot;)\n    public String loadData() {\n        locationService.load(&quot;https:\/\/raw.githubusercontent.com\/dr5hn\/countries-states-cities-database\/master\/countries%2Bstates%2Bcities.json&quot;);\n        return &quot;Data loading initiated!&quot;;\n    }\n\n    @GetMapping(&quot;\/countries&quot;)\n    public List&lt;Country&gt; getAllCountries() {\n        return locationService.getCountries();\n    }\n\n    \/\/ ... other endpoints for states, cities, etc.\n}\n<\/code><\/pre>\n<p><strong>Enhancements<\/strong><\/p>\n<ul>\n<li><strong>PDF Parsing:<\/strong> Implement the <code>readJsonFromPdf<\/code> method in the <code>LocationService<\/code> using a PDF parsing library to extract the JSON data from \u201clocation.pdf.\u201d<\/li>\n<li><strong>Error Handling:<\/strong> Add comprehensive error handling and logging to the <code>load<\/code> method to gracefully manage potential exceptions.<\/li>\n<li><strong>Data Validation:<\/strong> Consider adding validation logic to the entities or service to ensure data integrity before saving to the database.<\/li>\n<li><strong>API Documentation:<\/strong> Use tools like Swagger to document your<\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":3705,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[435],"tags":[69,319],"series":[],"class_list":["post-3704","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-spring_databases","tag-java-2","tag-spring"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/09\/international-1751293_1280.png?fit=1265%2C1280&ssl=1","jetpack-related-posts":[{"id":3502,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_databases\/spring-data-jpa-for-dummies-persisting-data-like-a-pro\/","url_meta":{"origin":3704,"position":0},"title":"Spring Data JPA for Dummies: Persisting Data Like a Pro","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"Ever feel bogged down by writing tons of code just to interact with your database? If you're a Java developer working with relational databases, Spring Data JPA is your new best friend. This blog post will give you a beginner-friendly introduction to Spring Data JPA, showing you how to save\u2026","rel":"","context":"In &quot;Spring Databases&quot;","block_context":{"text":"Spring Databases","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_databases\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/binary-2904980_1280.jpg?fit=1200%2C674&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/binary-2904980_1280.jpg?fit=1200%2C674&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/binary-2904980_1280.jpg?fit=1200%2C674&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/binary-2904980_1280.jpg?fit=1200%2C674&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/binary-2904980_1280.jpg?fit=1200%2C674&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":3471,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_databases\/spring-jpa-auditing\/","url_meta":{"origin":3704,"position":1},"title":"Spring JPA Auditing","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"Simplifying Entity Auditing with Spring Data JPA Annotations Keeping track of who created and modified your entities is crucial for various purposes, including audit trails, security, and data lineage. Spring Data JPA offers a convenient and efficient way to achieve this through dedicated annotations: @CreatedBy, @LastModifiedBy, @CreatedDate, and @LastModifiedDate. Leveraging\u2026","rel":"","context":"In &quot;Spring Databases&quot;","block_context":{"text":"Spring Databases","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_databases\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/02\/audit-4190944_640.jpg?fit=640%2C377&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/02\/audit-4190944_640.jpg?fit=640%2C377&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/02\/audit-4190944_640.jpg?fit=640%2C377&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":3539,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_databases\/spring-data-cassandra-simplifying-java-development-with-apache-cassandra\/","url_meta":{"origin":3704,"position":2},"title":"Spring Data Cassandra: Simplifying Java Development with Apache Cassandra","author":"Jeffery Miller","date":"April 20, 2026","format":false,"excerpt":"Apache Cassandra is a powerful NoSQL database known for its scalability and high availability. Spring Data Cassandra seamlessly integrates Spring\u2019s familiar programming model with Cassandra, boosting developer productivity. Why Spring Data Cassandra? Simplified Configuration: Spring Boot auto-configuration minimizes manual setup. Object-Relational Mapping (ORM): Easily map Java objects to Cassandra tables.\u2026","rel":"","context":"In &quot;Spring Databases&quot;","block_context":{"text":"Spring Databases","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_databases\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/network-3396348_1280.jpg?fit=1200%2C720&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/network-3396348_1280.jpg?fit=1200%2C720&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/network-3396348_1280.jpg?fit=1200%2C720&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/network-3396348_1280.jpg?fit=1200%2C720&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/network-3396348_1280.jpg?fit=1200%2C720&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":3925,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_databases\/spring-data-jpa-java-records-the-ultimate-duo-for-clean-fast-query-projections\/","url_meta":{"origin":3704,"position":3},"title":"Spring Data JPA &#038; Java Records: The Ultimate Duo for Clean, Fast Query Projections","author":"Jeffery Miller","date":"April 20, 2026","format":false,"excerpt":"Architecting Efficient Data Access with Immutability As Spring developers, we spend a significant amount of time optimizing the path between the database and the client. One of the most common performance pitfalls is the over-fetching of data\u2014loading entire, complex JPA entities when all we need is a small subset of\u2026","rel":"","context":"In &quot;Spring Databases&quot;","block_context":{"text":"Spring Databases","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_databases\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/11\/record-shop-9180482_1280.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/11\/record-shop-9180482_1280.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/11\/record-shop-9180482_1280.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/11\/record-shop-9180482_1280.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/11\/record-shop-9180482_1280.avif 3x"},"classes":[]},{"id":3530,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_databases\/spring-jpa-auditing-track-data-changes\/","url_meta":{"origin":3704,"position":4},"title":"Spring JPA Auditing: Track Data Changes","author":"Jeffery Miller","date":"April 20, 2026","format":false,"excerpt":"In the dynamic world of software development, understanding the complete history of your data is crucial. Who made a change? When did it occur? Who viewed the data? Spring JPA Auditing, combined with custom solutions, offers a comprehensive way to answer these questions, acting as a time machine for your\u2026","rel":"","context":"In &quot;Spring Databases&quot;","block_context":{"text":"Spring Databases","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_databases\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/image.png?fit=1200%2C686&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/image.png?fit=1200%2C686&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/image.png?fit=1200%2C686&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/image.png?fit=1200%2C686&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/06\/image.png?fit=1200%2C686&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":3757,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_databases\/connecting-to-multiple-mongodb-databases-with-spring-data\/","url_meta":{"origin":3704,"position":5},"title":"Connecting to Multiple MongoDB Databases with Spring Data","author":"Jeffery Miller","date":"December 23, 2025","format":false,"excerpt":"Modern applications, especially in a microservices architecture, often require interaction with multiple databases. This is particularly common with NoSQL databases like MongoDB, where different services might have their own dedicated databases. Spring Data MongoDB simplifies the management of multiple MongoDB datasources within your application. This article provides a comprehensive guide\u2026","rel":"","context":"In &quot;Spring Databases&quot;","block_context":{"text":"Spring Databases","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_databases\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8180209_1280-jpg.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8180209_1280-jpg.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8180209_1280-jpg.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8180209_1280-jpg.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/10\/ai-generated-8180209_1280-jpg.avif 3x"},"classes":[]}],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3704","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/comments?post=3704"}],"version-history":[{"count":1,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3704\/revisions"}],"predecessor-version":[{"id":3706,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3704\/revisions\/3706"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/media\/3705"}],"wp:attachment":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/media?parent=3704"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/categories?post=3704"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/tags?post=3704"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/series?post=3704"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}