<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged update</title>
<link>https://coderlegion.com/tag/update</link>
<description>Powered by Question2Answer</description>
<item>
<title>Fantasy Planet Painter 2.0</title>
<link>https://coderlegion.com/30974/fantasy-planet-painter-2-0</link>
<description>&lt;p&gt;&lt;strong&gt;Fantasy Planet Painter 2.0&lt;/strong&gt; is here! This is our biggest update so far: a completely rebuilt application, a new physical terrain system, richer rendering, layered painting, fantasy world layers generation, and a much more capable &lt;strong&gt;World to Beyond&lt;/strong&gt; integration.&lt;/p&gt;
&lt;h3 id=&quot;the-basics-from-a-sketch-to-a-world&quot;&gt;The Basics: From a Sketch to a World&lt;/h3&gt;
&lt;p&gt;In our &lt;a rel=&quot;nofollow&quot; href=&quot;https://store.steampowered.com/news/app/3336490/view/704405656884478635&quot;&gt;earlier introduction to 2.0&lt;/a&gt;, we shared a first look at where Fantasy Planet Painter was heading. Now we would like to take a closer look at what you can create with this release.&lt;/p&gt;
&lt;p&gt;Fantasy Planet Painter started with a simple approach to world-map creation: paint the broad shape of a world on a cell grid, and a procedural algorithm generates the details. A creator focuses on where continents, oceans, and mountains belong without having to draw every terrain detail.&lt;/p&gt;
&lt;p&gt;That idea remains at the heart of 2.0. What has changed is how much more you can do around it. Heights can now have a physical meaning. Terrain can be built in layers. A painted planet can become an atlas of countries, cultures, settlements, and roads. And jump into very specific region of a world with additional details. After you are done experimenting with the shape, you can export the map and interactively play in Beyond All Reason.&lt;/p&gt;
&lt;h3 id=&quot;a-new-physical-planet&quot;&gt;A New Physical Planet&lt;/h3&gt;
&lt;p&gt;The new &lt;strong&gt;Physical World&lt;/strong&gt; generator works with elevations measured in meters, and provides broader control of flexible height ranges, with 12 levels by default. This gives you finer control over the relationship between your painted terrain, the generated detail, and the sea.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Continuous elevations:&lt;/strong&gt; paint specific heights, from deep ocean floors to mountain peaks, with twelve customizable paint bands to keep everyday painting approachable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Independent sea level:&lt;/strong&gt; explore how changing the water level reshapes your coastlines without repainting the whole planet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Planet size and relief:&lt;/strong&gt; adjust the planet radius and the strength of its terrain, with procedural detail that takes physical scale into account.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Seed control:&lt;/strong&gt; keep a result you like or try a different realization of the same broad geography.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Painted terrain alone:&lt;/strong&gt; turn off the added procedural detail when you want to see the heightfield you have authored more directly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terrain operations:&lt;/strong&gt; set, add, multiply, reshape with a power curve, smooth, normalize, terrace, or invert elevations. Operations can target land, water, or the whole canvas, and work with selections; coast preservation is available where appropriate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are also &lt;strong&gt;(experimental)&lt;/strong&gt; &lt;strong&gt;fourteen editable preset terrain recipes&lt;/strong&gt;, including Volcano and Fractious, for exploring different starting shapes. Recipes combine a seed and density with editable generation instructions, can be previewed before applying them, and can be retained with a terrain layer. They are useful both as starting points and as material to paint over.&lt;/p&gt;
&lt;h3 id=&quot;more-ways-to-create-your-world&quot;&gt;More Ways to Create Your World&lt;/h3&gt;
&lt;p&gt;A world can feel very different as an atlas, a globe, or a view looking across its surface. 2.0 expands the rendering tools so you can explore those differences without rebuilding your geography.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Physical terrain colouring:&lt;/strong&gt; elevation, slope, and climate views, alongside the familiar classic palettes. Latitude can influence the appearance of the land and polar regions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terrain lighting:&lt;/strong&gt; cast shadows, sky occlusion, adjustable sun direction and height, and shading exaggeration to bring out the shape of the landscape.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A rendered 3D view:&lt;/strong&gt; look toward the terrain from different distances and angles, with atmosphere, ocean, and volumetric clouds. Adjust cloud coverage and height to change the mood of a scene.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Geographic guides:&lt;/strong&gt; latitude and longitude grids, plus a kilometre scale tied to the size of your planet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Live previews:&lt;/strong&gt; see updates while painting, with background rendering, progress feedback, and cancellation for longer renders.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A clearer connection between canvas and preview:&lt;/strong&gt; the viewport outline helps you keep track of the area you are looking at when working across projections.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The eleven map projections are the same &lt;strong&gt;Equirectangular, Mercator, Orthographic, Gall–Peters, Mollweide, Interrupted sinusoidal, Stereographic, Gnomonic, Icosahedral, Equal-area azimuthal, and Conical&lt;/strong&gt;. Use them to compare the same world from different perspectives, or choose the one that suits your finished map.&lt;/p&gt;
&lt;h3 id=&quot;painting-layers-and-more-space-to-experiment&quot;&gt;Painting, Layers, and More Space to Experiment&lt;/h3&gt;
&lt;p&gt;The painting workspace has been rebuilt around a more flexible canvas and &lt;strong&gt;terrain layers&lt;/strong&gt;, allowing a non-destructive workflow. This allows you to manage different features and separate terrain changes from exiting shapes, such as trying a different mountain range, or hiding a layer to compare different versions of your geography.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Layer controls:&lt;/strong&gt; add, name, reorder, hide, lock, and remove terrain layers. Transparent areas and the eraser reveal what is underneath.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Direct and shaped painting:&lt;/strong&gt; Point, Box, Circle, and Polygon tools for everything from a single cell to a whole landmass.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Soft and blending brushes:&lt;/strong&gt; shape transitions with Linear, Smoothstep, Quadratic, Cubic, Exponential, or Gaussian falloff.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Two kinds of fill:&lt;/strong&gt; fill a connected neighbourhood or replace matching heights across the canvas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Selections:&lt;/strong&gt; isolate part of the map for painting and terrain operations, or move selected geography.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Canvas transformations:&lt;/strong&gt; raise or lower terrain, shift with wrapping or clipping, flip a map, and fill areas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grid controls:&lt;/strong&gt; resize, expand or shrink the canvas, and double or halve its resolution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Painting conveniences:&lt;/strong&gt; zoom and pan, preview the brush footprint, and pick an existing height from the canvas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Undo and redo:&lt;/strong&gt; revisit strokes and other changes through the history, with clearer handling of unsaved work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Several of these tools grew through the 1.x updates. They now sit together in a workspace designed for the larger range of things a 2.0 world can contain.&lt;/p&gt;
&lt;h3 id=&quot;build-a-fantasy-world-to-suit-your-terrain&quot;&gt;Build a Fantasy World to Suit Your Terrain&lt;/h3&gt;
&lt;p&gt;Once you have a Physical World you like, &lt;strong&gt;world layers&lt;/strong&gt; can develop it into a fantasy atlas. Choose the number of countries and settlements, the map detail, and a presentation style, then generate a world that follows your geography.&lt;/p&gt;
&lt;p&gt;This can add &lt;strong&gt;biomes, rivers, lakes, countries, borders, cultures, religions, provinces, settlements, place names, and roads&lt;/strong&gt;. Building the atlas leaves your painted terrain intact, and rebuilding can be undone if you prefer the previous result.&lt;/p&gt;
&lt;p&gt;Different map presets let you explore different sides of the same world:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Political:&lt;/strong&gt; countries, borders, towns, rivers, and roads.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cultural, Religions, and Provinces:&lt;/strong&gt; the people of the world, their beliefs, and its internal divisions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Biomes, Physical, and Heightmap:&lt;/strong&gt; the landscape, climate zones, ice, and elevation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Temperature, Precipitation, and Population:&lt;/strong&gt; climate and patterns of habitation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Goods, Trade, and Military:&lt;/strong&gt; resources, markets, trade routes, and armies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Emblems and Points of interest:&lt;/strong&gt; heraldry and places worth a journey.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can also switch individual overlays on and off to create your own combination. Changing what is shown does not regenerate the world, so you can move between a political map and a climate map while keeping the same underlying geography.&lt;/p&gt;
&lt;p&gt;For your own landmarks, &lt;strong&gt;named world locations&lt;/strong&gt; let you mark locations and retain their names and coordinates as you change projection. A useful way to start making the world yours is to name the first island, mountain, or city that catches your imagination.&lt;/p&gt;
&lt;h3 id=&quot;a-world-with-many-styles&quot;&gt;A World with Many Styles&lt;/h3&gt;
&lt;p&gt;World layers come with &lt;strong&gt;fifteen presentation styles&lt;/strong&gt;: Atlas, Parchment, Ink, Climate, Ancient, Political Atlas, Clean, Cyberpunk, Dark Seas, Gloom, Light, Monochrome, Night, Pale, and Watercolor.&lt;/p&gt;
&lt;p&gt;Each changes the colours, lettering, and linework while keeping the geography in place. The same world can become a restrained reference atlas, an old parchment chart, a dark ocean map, or a softer illustrated view. You can explore the styles without committing to a new generation of the world.&lt;/p&gt;
&lt;p&gt;When it is time to share your work, export the terrain and visible world layers together as an image, or take the world layers out separately as &lt;strong&gt;vector SVG&lt;/strong&gt; or &lt;strong&gt;transparent PNG&lt;/strong&gt;. Vector exports include shapes and outlined lettering, with optional legend and scale, for further composition in a drawing application.&lt;/p&gt;
&lt;h3 id=&quot;save-and-share-your-worlds&quot;&gt;Save and Share Your Worlds&lt;/h3&gt;
&lt;p&gt;The &lt;strong&gt;&lt;code&gt;.fpp2&lt;/code&gt; document format&lt;/strong&gt; keeps terrain layers, physical elevations, sea level, seeds and generation settings, named places, and the generated atlas with its presentation. It is the format to use when you want to continue developing a 2.0 world.&lt;/p&gt;
&lt;p&gt;Your existing &lt;strong&gt;&lt;code&gt;.planet&lt;/code&gt; files still open&lt;/strong&gt;. Legacy export is also available for older workflows, including the bridge to World to Beyond. That export flattens the visible terrain into the original nine height categories, so keep a &lt;code&gt;.fpp2&lt;/code&gt; master to preserve the new layers, places, and atlas.&lt;/p&gt;
&lt;p&gt;Other import and export options include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Heightmap import:&lt;/strong&gt; greyscale images, colour-to-height mapping, and Terrain-RGB elevation data.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;16-bit heightmaps:&lt;/strong&gt; take continuous terrain elevations into other terrain tools and game workflows.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Painted map images and text:&lt;/strong&gt; exchange the underlying grid as an image or in the classic text format.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rendered PNGs:&lt;/strong&gt; export Physical and Legacy views up to &lt;strong&gt;8K on the long edge&lt;/strong&gt;, and Flat Land views up to &lt;strong&gt;4K&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Drag-and-drop opening:&lt;/strong&gt; bring an existing world into the painting workspace.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rebuilt interface also brings a more adjustable workspace, scrollable palettes, canvas navigation, and built-in help for the main workflows.&lt;/p&gt;
&lt;h3 id=&quot;flat-worlds-and-familiar-favourites&quot;&gt;Flat Worlds and Familiar Favourites&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Physical Planet&lt;/strong&gt; is the new focus moving forward, but the other ways of making maps remain part of the app.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Legacy&lt;/strong&gt; preserves the original generator and its nine height categories, eleven projections, and eighteen themes. It is there for returning projects and for anyone who enjoys the original approach.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flat Land&lt;/strong&gt; is a useful choice for bounded maps rather than whole planets. It offers 2D and relief views, eight themes, and controls for erosion, hydrology, inland lakes, and the water plane. It can take your work in a different direction when you are thinking about a single landscape or a game map.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;experimental-steam-achievements&quot;&gt;Experimental Steam Achievements&lt;/h3&gt;
&lt;p&gt;We are also adding &lt;strong&gt;experimental Steam achievements&lt;/strong&gt; to bring a little extra fun to using the app. They celebrate creative milestones and encourage you to try different tools, views, painting techniques, and worldbuilding possibilities.&lt;/p&gt;
&lt;p&gt;Alongside them is a curated set of achievement illustrations with a stylized look. We hope these small rewards adds a bit more reward to your journey as you explore and create. They are also useful to guide you what to try next.&lt;/p&gt;
&lt;p&gt;Achievement support is experimental in this release, and we welcome feedback if an unlock does not behave as expected. Some milestones are tied to capabilities beyond the current public build, so the achievement list will continue to develop with the app.&lt;/p&gt;
&lt;h3 id=&quot;world-to-beyond-a-rebuilt-map-studio&quot;&gt;World to Beyond: A Rebuilt Map Studio&lt;/h3&gt;
&lt;p&gt;The free &lt;a rel=&quot;nofollow&quot; href=&quot;https://store.steampowered.com/app/4444360/Fantasy_Planet_Painter__World_to_Beyond/&quot;&gt;World to Beyond DLC&lt;/a&gt; now arrives alongside 2.0 with a rebuilt GUI for creating maps for &lt;strong&gt;Beyond All Reason and other Spring/Recoil games&lt;/strong&gt;. The major road block from previous teaser is the now fully integrated map format generator, getting rid of third-party dependencies.&lt;/p&gt;
&lt;p&gt;The earlier exporter centred on turning a planet into a map. The new studio workflow gives the other parts of that map their own space: resources, vegetation, water, scenery, and the final output.&lt;/p&gt;
&lt;p&gt;Its seven stages cover the complete project:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Source:&lt;/strong&gt; begin with a painted planet or a procedural map, choose a generation scheme, and set the map size.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terrain:&lt;/strong&gt; tune height range; procedural sources offer terrain styles, themes, generation controls, erosion, previews, and playability readouts. Imported heightmaps and ground textures provide further ways to bring in your own material.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metal:&lt;/strong&gt; place resources in a dedicated painting workspace, with automatic placement and brush controls including softness and symmetry.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Grass:&lt;/strong&gt; grow vegetation from terrain rules, then paint over the result to refine its coverage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Water:&lt;/strong&gt; adjust the water appearance and judge it against a live coastline sample.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Features:&lt;/strong&gt; use generated scenery or import &lt;code&gt;.obj&lt;/code&gt;, &lt;code&gt;.gltf&lt;/code&gt;, and &lt;code&gt;.glb&lt;/code&gt; models. Set scatter rules and paint a separate placement mask for each model—for example, trees along a ridge and boulders near the shore—and preview where they will land.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Output:&lt;/strong&gt; build a complete &lt;code&gt;.sd7&lt;/code&gt; map archive, including terrain, textures, resources, grass, water settings, and scenery, with progress feedback and cancellation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is also a &lt;strong&gt;real-time 3D viewer&lt;/strong&gt; for inspecting the terrain, water, vegetation, scenery, resource spots, and start positions before compiling the archive. &lt;strong&gt;It currently requires OpenGL 4.3 support and will not work on macOS&lt;/strong&gt;. And if you are patient enough to read till this line - &lt;em&gt;there are more interactive ways to inspect and play with your map coming in future updates!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Studio projects can be saved as &lt;strong&gt;&lt;code&gt;.w2b&lt;/code&gt; files&lt;/strong&gt;, retaining settings and painted channels so you can return to a map over several sessions. Custom model files remain external references, so keep those assets with your project.&lt;/p&gt;
&lt;p&gt;Whether you want to turn an unusual planet into a battlefield or just use W2B as a really easy utility to assembly a fully functional BAR map, there is a lot of freedom here.&lt;/p&gt;
&lt;h3 id=&quot;availability&quot;&gt;Availability&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Free for existing owners:&lt;/strong&gt; 2.0 is an update to Fantasy Planet Painter, with the free World to Beyond DLC releasing alongside it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Windows first:&lt;/strong&gt; macOS is coming later; we will share more when it is ready.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Updated pricing:&lt;/strong&gt; the price for new purchases has already changed to reflect the app's progress. Regional prices are shown on the Steam store.&lt;/li&gt;
&lt;li&gt;The current build is released with the hope that you could try the new features early on - it may contain many features that we have not tested thoroughly - expect follow-up updates to address rough corners.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;references&quot;&gt;References&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://store.steampowered.com/news/app/3336490/view/708909893000627309&quot;&gt;Steam Annoucement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Launches</category>
<guid isPermaLink="true">https://coderlegion.com/30974/fantasy-planet-painter-2-0</guid>
<pubDate>Tue, 13 Oct 2026 17:57:24 +0000</pubDate>
</item>
<item>
<title>Windows 10 officially ends on October 14, 2025</title>
<link>https://coderlegion.com/6284/windows-10-officially-ends-on-october-14-2025</link>
<description>&lt;h2 id=&quot;windows-10-officially-ends-on-october-14-2025&quot;&gt;Windows 10 officially ends on October 14, 2025&lt;/h2&gt;
&lt;p&gt;Windows 10 End of Support: On April 27, 2023, Microsoft publicly confirmed that Windows 10 version 22H2 would be its last Windows 10 feature update, and that support for Windows 10 (Home, Pro, Enterprise, Education, etc.) will end on October 14, 2025. Windows 10 marked a major turning point in Microsoft's OS History by unifying the Windows Experience across various devices under a single platform.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://winsides.com/wp-content/uploads/2025/10/Thank-you-Windows-10.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Its stability, broad compatibility, and adaptability made it one of the most widely used operating systems in the world, powering over a billion devices at its peak. As the proverb says, “Every good thing comes to an end,” and the same holds for Windows 10, one of Microsoft’s most successful operating systems.&lt;/p&gt;
&lt;h2 id=&quot;windows-10-timeline&quot;&gt;Windows 10 Timeline&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://winsides.com/wp-content/uploads/2025/10/Windows-10-Important-Dates.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;what-happens-to-windows-10-after-october-14-2025-&quot;&gt;What happens to Windows 10 after October 14, 2025?&lt;/h2&gt;
&lt;p&gt;Microsoft will officially end support for Windows 10, and it will no longer receive security updates, bug fixes, or new features. While computers running Windows 10 will continue to function, they will gradually become more vulnerable to security threats and less compatible with newer software, hardware, and online services. Users who remain on Windows 10 after this date may face increasing risks and limited support from other developers, as most companies will shift their focus to Windows 11 and newer systems. Essentially, Windows 10 will still work, but it will no longer be safe or reliable for long-term use.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Winsides.com strongly advises all users to upgrade to a supported operating system, such as Windows 11, well before the end-of-support date on October 14, 2025, to maintain full security, stability, and access to the latest features. Continuing to use Windows 10 after this date will leave your system exposed to security threats and vulnerabilities, and you do so entirely at your own risk.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;upgrade-your-windows-10-to-windows-11&quot;&gt;Upgrade your Windows 10 to Windows 11&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://winsides.com/wp-content/uploads/2025/10/Upgrade-to-Windows-11-1024x576.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Upgrading to Windows 11 provides users with enhanced security, a modern design, and improved productivity features that Windows 10 cannot fully offer. With hardware-level protections like TPM 2.0, Secure Boot, and advanced ransomware safeguards, Windows 11 keeps your system and data more secure.&lt;/p&gt;
&lt;h2 id=&quot;take-away&quot;&gt;Take Away&lt;/h2&gt;
&lt;p&gt;As we approach the end of support for Windows 10 on October 14, 2025, it’s the perfect moment to reflect on the incredible journey this operating system has given us. Windows 10 transformed the way we work, play, and connect, offering stability, innovation, and a bridge between legacy systems and modern computing. While it will soon retire, its legacy will continue to influence how we interact with technology.&lt;/p&gt;
&lt;p&gt;Thank you, Windows 10! Thank you, Microsoft! With a heavy heart, goodbye Windows 10.&lt;/p&gt;
&lt;p&gt;For more interesting information, stay tuned to &lt;a rel=&quot;nofollow&quot; href=&quot;https://winsides.com&quot;&gt;Winsides.com&lt;/a&gt;. Happy Computing! Peace Out!&lt;/p&gt;
</description>
<category>Getting Started</category>
<guid isPermaLink="true">https://coderlegion.com/6284/windows-10-officially-ends-on-october-14-2025</guid>
<pubDate>Fri, 10 Oct 2025 16:44:09 +0000</pubDate>
</item>
<item>
<title>How to Upgrade to Windows 11: Compatibility, Steps, and Solutions</title>
<link>https://coderlegion.com/4052/how-to-upgrade-to-windows-11-compatibility-steps-and-solutions</link>
<description>&lt;h5 id=&quot;in-this-article-discover-how-to-seamlessly-upgrade-to-windows-11-ensuring-your-pc-stays-secure-and-up-to-date-learn-the-steps-check-compatibility-and-explore-options-if-your-device-isn-t-eligible-&quot;&gt;In this article, discover how to seamlessly upgrade to Windows 11, ensuring your PC stays secure and up-to-date. Learn the steps, check compatibility, and explore options if your device isn't eligible!&lt;/h5&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1752516026294/f19f9a5a-10c9-43e2-a11d-e38eaf3f550a.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;why-upgrading-to-windows-11-matters&quot;&gt;Why Upgrading to Windows 11 Matters&lt;/h4&gt;
&lt;p&gt;As of October 14, 2025, Microsoft will no longer support Windows 10. If your computer uses the Windows 10 operating system, it will no longer be supported. This means that security updates, feature updates, technical support, and more will cease, leaving your PC vulnerable.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;free-windows-11-upgrade&quot;&gt;FREE Windows 11 Upgrade&lt;/h4&gt;
&lt;p&gt;If your computer already has Windows 10 with a valid license and meets the minimum system requirements for Windows 11, you can upgrade for FREE!&lt;/p&gt;
&lt;p&gt;The &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.microsoft.com/en-us/windows/windows-11-specifications#table1&quot;&gt;official documentation&lt;/a&gt; on Microsoft's website provides a comprehensive guide to checking whether your computer meets the system requirements.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;the-easiest-way-to-upgrade-to-windows-11&quot;&gt;The Easiest Way to Upgrade to Windows 11&lt;/h4&gt;
&lt;p&gt;Using Windows Update on your computer is the easiest way to upgrade to Windows 11.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;To Access Windows Update, Click:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Start&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Settings&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update &amp;amp; Security&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In Update &amp;amp; Security, run &lt;strong&gt;Windows Update&lt;/strong&gt;. Once your computer receives all the required updates, you should see a “Download and install“ button to upgrade to Windows 11, if it’s not already displayed.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1752255915581/74042961-90ce-411f-a2a8-1f502e0cf76b.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Be sure to read and follow all of Microsoft’s prompts and documentation to ensure a smooth upgrade from Windows 10 to 11.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;if-you-don-t-see-an-upgrade-option&quot;&gt;If You Don’t See an Upgrade Option&lt;/h4&gt;
&lt;p&gt;After running &lt;strong&gt;Windows Update&lt;/strong&gt;, if you still do not see an option to upgrade to Windows 11, you can use Microsoft's official &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.microsoft.com/en-us/windows/windows-11#pchealthcheck&quot;&gt;PC Health Check App&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1752256771872/6947c222-ec45-411f-970c-6a9725399777.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Next to the “Download PC Health Check app“ button is a helpful link to Windows 11 system requirements.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;if-your-computer-fails-the-compatibility-test&quot;&gt;If Your Computer Fails The Compatibility Test&lt;/h4&gt;
&lt;p&gt;Unfortunately, if your computer fails the compatibility test, you will not be able to upgrade it to Windows 11. If you want to ensure that your computer continually receives security updates, feature updates, technical support, and more, you will need to consider buying a new one with Windows 11 installed, or if you’re adventurous, you can alternatively build a PC and purchase a Windows 11 license.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;My main home laptop doesn't meet the requirements because of the processor. Luckily, I already own another laptop that came with Windows 11 preinstalled, which will now be my primary device as I retire my older one with Windows 10, since it will no longer be supported.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1752598078836/dcae3c68-cc35-47c1-89ca-957fa0ee710b.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;my-other-related-articles&quot;&gt;My other related articles&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/02-25/what-is-microsoft-vba-and-why-you-should-learn-it/&quot;&gt;What is Microsoft VBA and Why You Should Learn It&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/03-25/from-javascript-to-vba-navigating-variable-declaration-and-management/&quot;&gt;From JavaScript to VBA: Navigating Variable Declaration and Management&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/03-25/mastering-excel-vlookup-and-custom-vba-functions-for-key-value-data-retrieval/&quot;&gt;Mastering Excel: VLOOKUP and Custom VBA Functions for Key-Value Data Retrieval&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/03-25/mastering-excels-ifna-efficient-value-retrieval-and-vlookup-integration/&quot;&gt;Mastering Excel's IFNA: Efficient Value Retrieval and VLOOKUP Integration&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/04-25/mastering-vba-load-and-manipulate-data-in-excel-arrays/&quot;&gt;Mastering VBA: Load and Manipulate Data in Excel Arrays&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1740168177634/1ff578a9-5d03-4800-9c0c-9092e4e60c4f.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;be-sure-to-listen-to-the-html-all-the-things-podcast-&quot;&gt;&lt;strong&gt;Be sure to listen to the HTML All The Things Podcast!&lt;/strong&gt;&lt;/h4&gt;
&lt;h5 id=&quot;-i-also-write-articles-for-the-html-all-the-things-podcast-which-you-can-read-on-their-website-https-www-htmlallthethings-com-&quot;&gt;???? &lt;em&gt;I also write articles for the HTML All The Things Podcast, which you can read on their website:&lt;/em&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.htmlallthethings.com/&quot;&gt;&lt;em&gt;https://www.htmlallthethings.com/&lt;/em&gt;&lt;/a&gt;&lt;em&gt;.&lt;/em&gt;&lt;/h5&gt;
&lt;h5 id=&quot;be-sure-to-check-out-html-all-the-things-on-socials-&quot;&gt;&lt;strong&gt;Be sure to check out HTML All The Things on socials!&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://twitter.com/htmleverything&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/company/html-all-the-things/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.tiktok.com/@htmlallthethings&quot;&gt;TikTok&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.instagram.com/htmlallthethings/&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id=&quot;affiliate-amp-discount-links-&quot;&gt;Affiliate &amp;amp; Discount Links!&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1740168473785/c85789c9-1594-4000-aa2f-43e842f9825f.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With CodeMonkey, learning can be all fun and games!&lt;/strong&gt; CodeMonkey transforms education into an engaging experience, enabling children to evolve from tech consumers to creators. Use CodeMonkey's &lt;strong&gt;FREE trial&lt;/strong&gt; to unlock the incredible potential of young tech creators!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;With a structured learning path tailored for various age groups, kids progress from block coding to more advanced topics like data science and artificial intelligence, using languages such as CoffeeScript and Python. The platform includes features for parents and teachers to track progress, making integrating coding into home and classroom settings easy.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Through fun games, hands-on projects, and community interaction, CodeMonkey helps young learners build teamwork skills and receive recognition for their achievements. It fosters a love for coding and prepares children for future career opportunities in an ever-evolving tech landscape.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;To learn more about CodeMonkey, you can read my detailed&lt;/em&gt;&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/02-25/inspiring-young-coders-how-codemonkey-turns-kids-into-tech-creators/&quot;&gt;&lt;strong&gt;&lt;em&gt;review article&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt;!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Affiliate Links:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://codemonkey.sjv.io/c/5987452/919057/12259&quot;&gt;Sign Up for Parents&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://codemonkey.sjv.io/c/5987452/919060/12259&quot;&gt;Sign Up for Teachers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.hashnode.com/res/hashnode/image/upload/v1740169191630/ac8c5360-d1c5-4c85-8504-18b9c755841e.png&amp;quot;&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;advance-your-career-with-a-20-discount-on-scrimba-pro-using-this-affiliate-link-&quot;&gt;Advance your career with a 20% discount on Scrimba Pro using this &lt;a rel=&quot;nofollow&quot; href=&quot;https://scrimba.com/?via=MichaelLarocca&quot;&gt;affiliate link&lt;/a&gt;!&lt;/h4&gt;
&lt;p&gt;Become a hireable developer with Scrimba Pro! Discover a world of coding knowledge with full access to all courses, hands-on projects, and a vibrant community. You can &lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2021/06-21/06-07-21/&quot;&gt;read my article&lt;/a&gt; to learn more about my exceptional experiences with Scrimba and how it helps many become confident, well-prepared web developers!&lt;/p&gt;
&lt;h6 id=&quot;important-this-discount-is-for-new-accounts-only-if-a-higher-discount-is-currently-available-it-will-be-applied-automatically-&quot;&gt;&lt;strong&gt;&lt;em&gt;Important:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;This discount is for new accounts only. If a higher discount is currently available, it will be applied automatically.&lt;/em&gt;&lt;/h6&gt;
&lt;p&gt;&lt;strong&gt;How to Claim Your Discount:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click &lt;a rel=&quot;nofollow&quot; href=&quot;https://scrimba.com/?via=MichaelLarocca&quot;&gt;the link&lt;/a&gt; to explore the new Scrimba 2.0.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new account.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upgrade to Pro; the 20% discount will automatically apply.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h6 id=&quot;disclosure-this-article-contains-affiliate-links-i-will-earn-a-commission-from-any-purchases-made-through-these-links-at-no-extra-cost-to-you-your-support-helps-me-continue-creating-valuable-content-thank-you-&quot;&gt;&lt;strong&gt;&lt;em&gt;Disclosure:&lt;/em&gt;&lt;/strong&gt; &lt;em&gt;This article contains affiliate links. I will earn a commission from any purchases made through these links at no extra cost to you. Your support helps me continue creating valuable content. Thank you!&lt;/em&gt;&lt;/h6&gt;
&lt;hr&gt;
&lt;h4 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;Microsoft will end support for Windows 10 on October 14, 2025, making any PC running that version vulnerable. Upgrading to Windows 11 is FREE and easy via Windows Update, as long as your PC meets the system requirements.&lt;/p&gt;
&lt;p&gt;If you don't see an option to download Windows 11 through Windows Update, you can use Microsoft's official &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.microsoft.com/en-us/windows/windows-11#pchealthcheck&quot;&gt;PC Health Check app&lt;/a&gt; to see if your PC meets the upgrade requirements. If it doesn't, upgrading isn't possible, and you'll need to consider buying a new computer or building one and purchasing an additional Windows 11 license.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Let’s connect! I’m active on&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/in/michaeljudelarocca/&quot;&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;and&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://twitter.com/MikeJudeLarocca&quot;&gt;&lt;strong&gt;Twitter&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://miro.medium.com/v2/resize:fit:700/0*WkkMi-AgjubeODf8.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h6 id=&quot;are-you-now-confident-in-upgrading-to-windows-11-and-ensuring-your-pc-s-security-do-you-have-any-other-tips-for-a-smooth-upgrade-process-please-share-the-article-and-comment-&quot;&gt;&lt;em&gt;Are you now confident in upgrading to Windows 11 and ensuring your PC's security? Do you have any other tips for a smooth upgrade process? Please share the article and comment!&lt;/em&gt;&lt;/h6&gt;
</description>
<category>Installation</category>
<guid isPermaLink="true">https://coderlegion.com/4052/how-to-upgrade-to-windows-11-compatibility-steps-and-solutions</guid>
<pubDate>Tue, 15 Jul 2025 21:01:08 +0000</pubDate>
</item>
<item>
<title>Spring Data Neo4j: How to update an entity</title>
<link>https://coderlegion.com/1306/spring-data-neo4j-how-to-update-an-entity</link>
<description>&lt;p&gt;After working on a new &lt;a rel=&quot;nofollow&quot; href=&quot;https://graphacademy.neo4j.com/courses/app-spring-data/&quot;&gt;online Spring Data Neo4j course&lt;/a&gt;, I learned a couple more things about updating an entity. The course required a different set of scenarios than outlined in my previous &lt;a rel=&quot;nofollow&quot; href=&quot;https://jmhreif.com/blog/2023/sdn-cypher-update-entity/&quot;&gt;SDN update blog post&lt;/a&gt;, so I wanted to cover those scenarios, as well.&lt;/p&gt;
&lt;h3 id=&quot;spring-save-method&quot;&gt;Spring save() method&lt;/h3&gt;
&lt;p&gt;First up is the out-of-the-box &lt;code&gt;save()&lt;/code&gt; method that is provided by Spring as a default. This method takes an input of the entity object you want to save to the database.&lt;/p&gt;
&lt;p&gt;Here is an example of what this looks like with a popular movie data set as the model.&lt;/p&gt;
&lt;p&gt;Movie domain class:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@Node
public class Movie {
     @Id
     private String movieId;
    
     private String title;
     private String plot;
     private String poster;
     private String url;
     private String released;
     private Long imdbVotes;
    
     @Relationship(value = &quot;ACTED_IN&quot;, direction = Relationship.Direction.INCOMING)
     private List&amp;lt;Role&amp;gt; actors;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Movie controller class:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@RestController
@RequestMapping(&quot;/movies&quot;)
public class MovieController {
    //inject repository + constructor

    @PostMapping(&quot;/save&quot;)
    Movie save(@RequestBody Movie movie) {
        return movieRepo.save(movie);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This works well to save a new movie, as you can provide a subset of properties or all properties, as long as the &lt;code&gt;id&lt;/code&gt; is present, and anything you don't provide will be set to &lt;code&gt;null&lt;/code&gt;. However, the issue arises when you need to update an existing entity because it means any attributes you do not provide will be &lt;em&gt;overwritten&lt;/em&gt; to &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;To better understand how this works, let's see it in action by saving a movie, and then trying to update it.&lt;/p&gt;
&lt;p&gt;Movie request object:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;movieId&quot;: &quot;9876&quot;,
  &quot;title&quot;: &quot;MyMovie&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Save Movie object:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;% http &quot;:8080/movies/save&quot; @src/main/resources/movie.json
{
    &quot;actors&quot;: null,
    &quot;imdbId&quot;: null,
    &quot;imdbVotes&quot;: null,
    &quot;movieId&quot;: &quot;9876&quot;,
    &quot;plot&quot;: null,
    &quot;poster&quot;: null,
    &quot;title&quot;: &quot;MyMovie&quot;,
    &quot;url&quot;: null,
    &quot;year&quot;: null
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now let's use the same method to try to update the movie with a &lt;code&gt;year&lt;/code&gt; property.&lt;/p&gt;
&lt;p&gt;MovieUpdated object:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;movieId&quot;: &quot;9876&quot;,
  &quot;year&quot;: 2018
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Save updated Movie object:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;% http &quot;:8080/movies/save&quot; @src/main/resources/movieUpdated.json
{
    &quot;actors&quot;: null,
    &quot;imdbId&quot;: null,
    &quot;imdbVotes&quot;: null,
    &quot;movieId&quot;: &quot;9876&quot;,
    &quot;plot&quot;: null,
    &quot;poster&quot;: null,
    &quot;title&quot;: null,
    &quot;url&quot;: null,
    &quot;year&quot;: 2018
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the output above, you can see that the &lt;code&gt;title&lt;/code&gt; property is &lt;code&gt;null&lt;/code&gt;, and the &lt;code&gt;year&lt;/code&gt; property is populated. This is because the title is not specified in the updated JSON object, so it is overwritten to &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This may not be too big of an effort if you have only a few attributes in your domain class, although I would still find it frustrating to include all properties for only updating one or two properties. In that case, I would need to resort to the &lt;a rel=&quot;nofollow&quot; href=&quot;https://jmhreif.com/blog/2023/sdn-cypher-update-entity/&quot;&gt;POJO method outlined in my previous SDN update blog post&lt;/a&gt; where you pull the database entity, set each property, and then save the entity. The added business logic seems like an unnecessary maintenance headache.&lt;/p&gt;
&lt;p&gt;What if you wanted to preserve what was already there without providing all the properties defined in the domain class to the request? In these scenarios, there are a couple of other options at your disposal, though neither allow dynamic updates to random properties per request.&lt;/p&gt;
&lt;h3 id=&quot;patch-year&quot;&gt;Patch Year&lt;/h3&gt;
&lt;p&gt;The first option is that you don't have to set all properties if you use a PATCH method and only set the values you want to update. Here is an example.&lt;/p&gt;
&lt;p&gt;Movie controller class:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@RestController
@RequestMapping(&quot;/movies&quot;)
public class MovieController {
    //inject repository + constructor

    @PatchMapping(&quot;/patchYear&quot;)
    Movie patchYear(@RequestBody Movie moviePatch) {
        Movie existingMovie = movieRepository.findById(moviePatch.getMovieId()).get();
        existingMovie.setYear(moviePatch.getYear());

        return movieRepository.save(existingMovie);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;PatchYear object:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;movieId&quot;: &quot;9876&quot;,
  &quot;year&quot;: 2024
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Patch movie year:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;% http PATCH &quot;:8080/movies/patchYear&quot; @src/main/resources/moviePatch.json

{
    &quot;budget&quot;: null,
    &quot;countries&quot;: null,
    &quot;imdbId&quot;: null,
    &quot;imdbRating&quot;: null,
    &quot;imdbVotes&quot;: null,
    &quot;languages&quot;: null,
    &quot;movieId&quot;: &quot;9876&quot;,
    &quot;plot&quot;: null,
    &quot;poster&quot;: null,
    &quot;released&quot;: null,
    &quot;revenue&quot;: null,
    &quot;runtime&quot;: null,
    &quot;title&quot;: &quot;MyMovie&quot;,
    &quot;tmdbId&quot;: null,
    &quot;url&quot;: null,
    &quot;year&quot;: 2024
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This allows you to set specific values without overwriting other property values to &lt;code&gt;null&lt;/code&gt;. You also don't need to set all the values in the movie object programmatically. If you modified the initial &lt;code&gt;save()&lt;/code&gt; method to just include the &lt;code&gt;setYear()&lt;/code&gt; line, it would still overwrite other values. This approach prevents that, although you still have to call &lt;code&gt;setProperty()&lt;/code&gt; for each field you want to update.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; For this approach to work, your domain entity must be a class (not a record) because records are immutable, which means you cannot change (or set/update) fields on the entity instance. For immutable objects, you have to create a new instance of the object and copy property values to the new object before saving.&lt;/p&gt;
&lt;p&gt;You can avoid setting each property on an object and retain existing values with a couple of options covered next.&lt;/p&gt;
&lt;h3 id=&quot;custom-cypher&quot;&gt;Custom Cypher&lt;/h3&gt;
&lt;p&gt;One of the more flexible options is to &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.spring.io/spring-data/neo4j/reference/appendix/custom-queries.html&quot;&gt;use custom Cypher&lt;/a&gt;. For this, you would write a Cypher statement that sets the new values to the properties you want to update. You can even add/set properties that do not exist on the application's domain class. The negative is that you would need to make changes to the application (Cypher statement) if you wanted to update different properties, so it is not fully dynamic.&lt;/p&gt;
&lt;p&gt;The example below uses the same movie domain but adds a Cypher statement and method to the repository interface to update the &lt;code&gt;year&lt;/code&gt; property without overwriting the &lt;code&gt;title&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Repository interface:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;interface MovieRepository extends Neo4jRepository&amp;lt;Movie, String&amp;gt; {
    @Query(&quot;MATCH (m:Movie {movieId: $movieId}) &quot; +
            &quot;SET m.year = toInteger($year) &quot; +
            &quot;RETURN m;&quot;)
    Movie updateYear(String movieId, Long year);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Movie controller class:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@RestController
@RequestMapping(&quot;/movies&quot;)
public class MovieController {
    //inject repository + constructor

    @PatchMapping(&quot;/updateYear&quot;)
    Movie patchYear(@RequestParam String movieId, @RequestParam Long year) {
        return movieRepository.updateYear(movieId, year);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, the following request calls the method and updates the movie's year property.&lt;/p&gt;
&lt;p&gt;Update movie year:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;% http PATCH &quot;:8080/movies/updateYear?movieId=9876&amp;amp;year=2018&quot;

{
    &quot;actors&quot;: [],
    &quot;imdbId&quot;: null,
    &quot;imdbVotes&quot;: null,
    &quot;movieId&quot;: &quot;9876&quot;,
    &quot;plot&quot;: null,
    &quot;poster&quot;: null,
    &quot;title&quot;: &quot;MyMovie&quot;,
    &quot;url&quot;: null,
    &quot;year&quot;: 2018
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It worked! The movie's title remained the same (not overwritten to &lt;code&gt;null&lt;/code&gt;), and a value was saved for the &lt;code&gt;year&lt;/code&gt; property.&lt;/p&gt;
&lt;p&gt;This ad hoc Cypher approach could work well when values or property updates occur somewhat frequently, as updating the Cypher statement makes updates flexible. You could also make the incoming property generic (&lt;code&gt;value&lt;/code&gt;) and pass in any value (or multiple values) and set whichever properties you'd like by changing the Cypher. While still not completely dynamic, this option is probably the most flexible and dynamic of the list.&lt;/p&gt;
&lt;p&gt;A custom Cypher approach might work well when you need to update certain properties, but if you have a subset of properties that operate together, another option is to create a projection of the domain class.&lt;/p&gt;
&lt;h3 id=&quot;projections&quot;&gt;Projections&lt;/h3&gt;
&lt;p&gt;To provide a consistent set of values for update and leave other properties as-is, &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.spring.io/spring-data/neo4j/reference/projections/sdn-projections.html&quot;&gt;projections&lt;/a&gt; are probably the nicest option I've found so far. This approach still requires setting consistent properties (like with custom Cypher), but avoids overwriting consistent values by creating a &quot;view&quot; of the larger entity, only working with those values and leaving other field values alone.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; There are two types of projections - interface and DTO. Interface projections are immutable, which means you cannot update values, but have to create a new object and copy existing values over. DTO objects, then, are more straightforward when dealing with update operations. For this reason, the examples use DTO-based projections.&lt;/p&gt;
&lt;p&gt;There are two different ways to &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.spring.io/spring-data/neo4j/reference/projections/sdn-projections.html#projections.sdn.persistence&quot;&gt;save a projection&lt;/a&gt; - 1. send the projection (subset of properties) and save into the full domain entity, 2. send a full domain object but only save the projection fields. Really, the difference is the incoming request object, whether you have a smaller set or larger set and only want to save those values.&lt;/p&gt;
&lt;p&gt;Let's see how this operates.&lt;/p&gt;
&lt;h3 id=&quot;projection-as-movie&quot;&gt;Projection as Movie&lt;/h3&gt;
&lt;p&gt;The first example sends a projection object (subset of the full domain object's properties) and saves the trimmed object as the full movie entity. We have defined a projection that only includes the &lt;code&gt;movieId&lt;/code&gt; and &lt;code&gt;plot&lt;/code&gt; properties of a movie.&lt;/p&gt;
&lt;p&gt;MovieDTOProjection class:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public class MovieDTOProjection {
    private String movieId;
    private String plot;

    public String getMovieId() { return movieId; }

    public String getPlot() {
        return plot;
    }

    public void setPlot(String plot) {
        this.plot = plot;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MovieController class method:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@RestController
@RequestMapping(&quot;/movies&quot;)
public class MovieController {
    //inject repository + constructor

    //Only updates properties in projection
    @PatchMapping(&quot;/projectionAsMovie&quot;)
    MovieDTOProjection saveProjectionAsMovie(@RequestBody MovieDTOProjection movieDTO) {
        return neo4jTemplate.save(Movie.class).one(movieDTO);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ProjectionAsMovie object (request object):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;movieId&quot;: &quot;9876&quot;,
  &quot;plot&quot;: &quot;Here is the plot.&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Update Movie with a projection object:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;% http PATCH &quot;:8080/movies/projectionAsMovie&quot; @src/main/resources/projectionAsMovie.json

{
    &quot;movieId&quot;: &quot;9876&quot;,
    &quot;plot&quot;: &quot;Here is the plot.&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Full database entity:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;plot&quot;: &quot;Here is the plot.&quot;,
    &quot;year&quot;: 2024,
    &quot;movieId&quot;: &quot;9876&quot;,
    &quot;title&quot;: &quot;MyMovie&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The request successfully updated the entity with the new plot value (&quot;Here is the plot.&quot;) without overwriting the title or year properties on the existing entity! The method in the controller class takes the projection object input and saves it as a &lt;code&gt;Movie&lt;/code&gt; class entity.&lt;/p&gt;
&lt;p&gt;This approach is helpful when you only want to send certain properties over the wire and not the full object. You can set any fields you wish to update in the projection and only send those values in the request.&lt;/p&gt;
&lt;h3 id=&quot;movie-entity-as-projection&quot;&gt;Movie entity as projection&lt;/h3&gt;
&lt;p&gt;This type of projection only saves a defined subset of properties out of a potentially larger or variable object. The save will only update the fields included in the projection and ignore anything else that might be in the request object.&lt;/p&gt;
&lt;p&gt;The example below uses the same &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/JMHReif/sdn-update-entity-round2/blob/main/src/main/java/com/jmhreif/sdn_update_entity_round2/MovieDTOProjection.java&quot;&gt;&lt;code&gt;MovieDTOProjection&lt;/code&gt; class&lt;/a&gt; as the above example. Then, we only need a new method in the controller to save the projection.&lt;/p&gt;
&lt;p&gt;MovieController class method:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@RestController
@RequestMapping(&quot;/movies&quot;)
public class MovieController {
    //inject repository + constructor

    //Only updates properties in projection (ignores other values)
    @PatchMapping(&quot;/movieAsProjection&quot;)
    MovieDTOProjection saveMovieAsProjection(@RequestBody Movie movie) {
        return neo4jTemplate.saveAs(movie, MovieDTOProjection.class);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MovieAsProjection object:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;movieId&quot;: &quot;9876&quot;,
  &quot;title&quot;: &quot;TestTitle&quot;,
  &quot;plot&quot;: &quot;Some plot cliche here.&quot;,
  &quot;year&quot;: 2025
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Send Movie object (only save projection values):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;% http PATCH &quot;:8080/movies/movieAsProjection&quot; @src/main/resources/movieAsProjection.json

{
    &quot;movieId&quot;: &quot;9876&quot;,
    &quot;plot&quot;: &quot;Some plot cliche here.&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Full database entity:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
    &quot;plot&quot;: &quot;Some plot cliche here.&quot;,
    &quot;year&quot;: 2024,
    &quot;movieId&quot;: &quot;9876&quot;,
    &quot;title&quot;: &quot;MyMovie&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This also worked! The controller method accepts a &lt;code&gt;Movie&lt;/code&gt; request object as input and saves it as the projection entity, which only retains the subset of values defined in the projection and ignores the rest.&lt;/p&gt;
&lt;p&gt;This approach would be helpful if you have request objects with varying fields of a &lt;code&gt;Movie&lt;/code&gt; entity, but only want to update a certain subset each time. In terms of the incoming request object, this option seems to be the most flexible in allowing you to provide all kinds of fields as input, and it will only save the relevant ones defined in the projection.&lt;/p&gt;
&lt;h3 id=&quot;wrapping-up-&quot;&gt;Wrapping Up!&lt;/h3&gt;
&lt;p&gt;In this post, we delved a bit deeper into updating entities using Spring Data and Neo4j. A &lt;a rel=&quot;nofollow&quot; href=&quot;https://jmhreif.com/blog/2023/sdn-cypher-update-entity/&quot;&gt;previous blog post on the topic&lt;/a&gt; outlined some examples for that use case at the time (microservices), but I learned about a few more options after working on the &lt;a rel=&quot;nofollow&quot; href=&quot;https://graphacademy.neo4j.com/courses/app-spring-data/&quot;&gt;GraphAcademy Spring Data Neo4j course&lt;/a&gt;. These options included custom Cypher statements and projections.&lt;/p&gt;
&lt;p&gt;There are still other pieces of the puzzle to explore and integrate, such as optimistic locking (with the &lt;code&gt;@Version&lt;/code&gt; field) and custom repository implementations for extending repositories (e.g. to combine &lt;code&gt;Neo4jRepository&amp;lt;&amp;gt;&lt;/code&gt;, &lt;code&gt;Neo4jTemplate&lt;/code&gt;, and/or &lt;code&gt;Neo4jClient&lt;/code&gt; levels of abstraction), but we will save those for a future blog post. Happy coding!&lt;/p&gt;
&lt;h3 id=&quot;resources&quot;&gt;Resources&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Code: &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/JMHReif/sdn-update-entity-round2&quot;&gt;sdn-update-entity-round2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Blog post: &lt;a rel=&quot;nofollow&quot; href=&quot;https://jmhreif.com/blog/2023/sdn-cypher-update-entity/&quot;&gt;previous SDN update article&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Graphacademy course (free, online, self-paced): &lt;a rel=&quot;nofollow&quot; href=&quot;https://graphacademy.neo4j.com/courses/app-spring-data/&quot;&gt;Spring Data Neo4j&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Documentation: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.spring.io/spring-data/neo4j/reference/projections/sdn-projections.html#projections.sdn.persistence&quot;&gt;SDN projection persistence&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Documentation: &lt;a rel=&quot;nofollow&quot; href=&quot;https://docs.spring.io/spring-data/neo4j/reference/repositories/custom-implementations.html&quot;&gt;SDN custom repository implementations&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
<category>Getting Started</category>
<guid isPermaLink="true">https://coderlegion.com/1306/spring-data-neo4j-how-to-update-an-entity</guid>
<pubDate>Thu, 27 Feb 2025 20:28:06 +0000</pubDate>
</item>
</channel>
</rss>