https://github.com/permazen/permazen Skip to content Toggle navigation Sign up * Product + Actions Automate any workflow + Packages Host and manage packages + Security Find and fix vulnerabilities + Codespaces Instant dev environments + Copilot Write better code with AI + Code review Manage code changes + Issues Plan and track work + Discussions Collaborate outside of code Explore + All features + Documentation + GitHub Skills + Blog * Solutions For + Enterprise + Teams + Startups + Education By Solution + CI/CD & Automation + DevOps + DevSecOps Resources + Customer Stories + White papers, Ebooks, Webinars + Partners * Open Source + GitHub Sponsors Fund open source developers + The ReadME Project GitHub community articles Repositories + Topics + Trending + Collections * Pricing Search or jump to... Search code, repositories, users, issues, pull requests... Search [ ] Clear Search syntax tips Provide feedback We read every piece of feedback, and take your input very seriously. [ ] [ ] Include my email address so I can be contacted Cancel Submit feedback Saved searches Use saved searches to filter your results more quickly Name [ ] Query [ ] To see all available qualifiers, see our documentation. Cancel Create saved search Sign in Sign up You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert {{ message }} permazen / permazen Public * Notifications * Fork 39 * Star 380 Language-Natural Persistence Layer for Java permazen.io/ License Apache-2.0 license 380 stars 39 forks Activity Star Notifications * Code * Issues 3 * Pull requests 1 * Actions * Projects 0 * Wiki * Security * Insights More * Code * Issues * Pull requests * Actions * Projects * Wiki * Security * Insights permazen/permazen This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. master Switch branches/tags [ ] Branches Tags Could not load branches Nothing to show {{ refName }} default View all branches Could not load tags Nothing to show {{ refName }} default View all tags Name already in use A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch? Cancel Create 3 branches 63 tags Code * Local * Codespaces * Clone HTTPS GitHub CLI [https://github.com/p] Use Git or checkout with SVN using the web URL. [gh repo clone permaz] Work fast with our official CLI. Learn more about the CLI. * Open with GitHub Desktop * Download ZIP Sign In Required Please sign in to use Codespaces. Launching GitHub Desktop If nothing happens, download GitHub Desktop and try again. Launching GitHub Desktop If nothing happens, download GitHub Desktop and try again. Launching Xcode If nothing happens, download Xcode and try again. Launching Visual Studio Code Your codespace will open once ready. There was a problem preparing your codespace, please try again. Latest commit Git stats * 3,646 commits Files Permalink Failed to load latest commit information. Type Name Latest commit message Commit time permazen-ant permazen-app permazen-cli-telnet permazen-cli permazen-cliapp permazen-coreapi permazen-demo permazen-guiapp permazen-jsck permazen-kv-array permazen-kv-bdb permazen-kv-caching permazen-kv-cockroach permazen-kv-fdb permazen-kv-leveldb permazen-kv-lmdb permazen-kv-mssql permazen-kv-mvstore permazen-kv-mysql permazen-kv-raft permazen-kv-rocksdb permazen-kv-simple permazen-kv-spanner permazen-kv-sql permazen-kv-sqlite permazen-kv-test permazen-kv-xodus permazen-kv permazen-main permazen-maven-plugin permazen-parse permazen-spring permazen-test permazen-util permazen-vaadin site src .gitignore CHANGES.txt LAYOUT.txt LICENSE.txt README.md TODO permazen-language-driven.pdf pom.xml View code [ ] Permazen is a different persistence layer for Java What is it? What's the motivation? What's the Downside? What are some interesting Java classes to look at? How are Java object, data structures, and indexes mapped into key/value pairs? Permazen Slides Permazen Article Permazen Paper Installing Permazen Documentation README.md Permazen is a different persistence layer for Java Permazen is a ground-up rethink of Java persistence. It has been in production use in commercial software since 2015. What is it? Permazen is: * A Java persistence layer for SQL, key-value, or in-memory databases * A rigorously defined, modular key/value API with adapters for 15+ database technologies * An object serialization framework * An automated schema management framework * A library for inverting Java references * A library for precise, non-local field change notifications * An embeddable Java command line interface (CLI) What's the motivation? Persistence is central to most applications. But there are many challenges involved in persistence programming that lie outside of the domain of simply storing the data. Mainstream Java solutions such as JDBC, JPA and JDO were designed simply to give Java programmers access to existing database functionality. They address the "storage" problem, but leave many other important issues that are inherent to persistence programming poorly addressed, or not addressed at all. Permazen is a completely different way of looking at persistence programming. Instead of starting from the storage technology side, it starts from the programming language side, asking the simple question, "What are the issues that are inherent to persistence programming, regardless of programming language or database storage technology, and how can they be addressed at the language level in the simplest, most correct, and most language-natural way?" With Permazen, not only are many issues inherent to persistence programming solved more easily and naturally than before, but also many issues that traditional solutions don't address at all are solved, and some entirely new, useful functionality is added. Permazen was inspired by years of frustration with existing persistence solutions, in particular JPA. Compared to using JPA, building an application with Permazen is a refreshingly straightforward experience. Ask these questions of your persistence solution: * Configuration complexity Do we have to explicitly configure details of how data is mapped? Are we forced to (ab)use the programming language to address what are really database configuration issues? * Query language concordance Does the code that performs queries look like regular Java code, or do we have to learn a new "query language"? * Query performance transparency Is the performance of a query visible and obvious from looking at the code that performs it? * Data type congruence Are database types equivalent to Java types across the entire domain of values? Are we guaranteed to always read back the same value we write? * First class offline data Can it be precisely defined which data is copied out of a transaction? Does offline data have all the rights and privileges of "online" (i.e., transactional) data? Does this include the ability to query indexes, and a framework for handling schema differences? Can offline data be easily serialized/deserialized? * Schema verification Is the schema assumed by the code cross-checked against the schema actually present in the database? Are we always guaranteed a consistent interpretation of stored data? * Incremental schema evolution Can multiple schemas exist at the same time in the database, to support rolling upgrades? Can data be migrated incrementally, i.e., without stopping the world? Are we free from "whole database" migration operations that would limit scalability? * Structural schema changes Are structural schema updates performed entirely automatically for us? * Semantic schema changes Is there a convenient way to specify semantic schema updates, at the language level (not the database level)? * Schema evolution type safety Is type safety and data type congruence guaranteed across arbitrary schema migrations? * Transactional validation Does validation, including reference validation, occur only at the end of the transaction (as it should), or randomly and inconveniently in the middle? * Cross-object validation Is it possible to define validation constraints that span multiple objects/records? Can we register for data-level notifications about changes in non-local objects? * Custom types and indexes Is it possible to define custom data types, have them be indexed? Is it easy to define arbitrary custom indexes? * Language-level data maintainability Can database maintenance tasks and queries be performed via a command line interface (CLI) using Java types, values, and expressions (including Java 8 streams and lambdas)? Are there convenient tools for manual and scripted use? * Data store independence Are we restricted to using only a specific type of database technology, or can virtually any database technology be used by implementing a simple API, making it easy to change later if needed? Permazen attempts to address all of these issues. It does so by treating the database as just a sorted key/value store and implementing everything else in Java: * Encoding/decoding of field values * Referential integrity; forward/reverse cascades * Indexes (simple and composite) * Query views * Schema management * Change notification * Validation queues * "Offline" data * Command line interface * GUI database editor Permazen also adds several new features that traditional databases don't provide. For example, you can define your own basic types and then index them however you want. What's the Downside? Permazen redefines the "line of demarcation" between a Java application and its supporting database. However, this has some implications: For an equivalent query, Permazen will perform more frequent, but smaller, database accesses. As a result, in situations where the code and the data are separated by a high latency network, Permazen will probably be too slow. Permazen is best suited for scenarios where the code and the data are running on the same machine or in close proximity. You have to learn something new. Persistence programming with Permazen requires a different way of thinking. For example, a "DAO" layer is often no longer necessary, and you may have to think harder about how to query your data efficiently, instead of crossing your fingers and hoping the database figures it out for you, because there is no query planner (you are the query planner). More flexible type hiearchies are possible, but it's also easy to make a mess. JPA has support for class inheritance and only partial support for generics. Permazen supports interface inheritance (including Java's equivalent of "mix-ins") and fully supports generic types. The restrictions imposed by JPA tend to force model classes to stay simpler. With Permazen, implementing an interface (directly or indirectly) can mean that a model class inherits a bunch of new persistent fields. What are some interesting Java classes to look at? Key/Value Layer * KVStore - A thing that contains key/value pairs * KVDatabase - A thing that persists key/value pairs * KVTransaction - A transaction for a KVDatabase * RaftKVDatabase - A distributed KVDatabase based on the Raft consensus algorithm. Java Layer * Permazen - A Permazen database instance * JTransaction - A Permazen database transaction * FieldType - How all simple database types are defined * JObject - Interface implemented by runtime-generated concrete model classes * @PermazenType - Annotation identifying your database classes * @JField - Annotation configuring your database fields Other * @OnChange - How change notifications are delivered * ReferencePath - Describes a path between objects that hops through one or more forward and/or inverse references * @OnVersionChange - How schema update "fixups" are defined * JObjectHttpMessageConverter - For sending/receiving versioned graphs of objects over the network using Spring How are Java object, data structures, and indexes mapped into key/ value pairs? See LAYOUT.txt. Permazen Slides For a quick overview, check out these slides from a JSimpleDB talk at a local Java user's group (Permazen was previously named JSimpleDB). Permazen Article Persistence Programming: Are We Doing This Right? appears in the Jan/ Feb 2022 issue of ACM Queue magazine. Permazen Paper For a deeper understanding of the motivation and design decisions behind Permazen, read Permazen: Language-Driven Persistence for Java. Abstract: Most software applications require durable persistence of data. From a programmer's point of view, persistence has its own set of inherent issues, e.g., how to manage schema changes, yet such issues are rarely addressed in the programming language itself. Instead, how we program for persistence has traditionally been driven by the storage technology side, resulting in incomplete and/or technology-specific support for managing those issues. In Java, the mainstream solution for basic persistence is the Java Persistence API (JPA). While popular, it also measures poorly on how well it addresses many of these inherent issues. We identify several examples, and generalize them into criteria for evaluating how well any solution serves the programmer's persistence needs, in any language. We introduce Permazen, a persistence layer for ordered key/value stores that, by integrating the data encoding, query, and indexing functions, provides a more complete, type-safe, and language-driven framework for managing persistence in Java, and addresses all of the issues we identify. Installing Permazen Permazen is available from Maven Central: io.permazen permazen-main or from the Ivy RoundUp ivy repository: You should also add the key/value store module(s) for whatever key/ value store(s) you want to use, e.g.: io.permazen permazen-kv-sqlite There is a demo distribution ZIP file that lets you play with the Permazen command line and GUI, using a simple database of the solar system. Documentation Documentation and links: * Introduction * Getting Started * FAQ * API Javadocs * Bullet-point JPA Comparison * Key/value pair database layout * Permazen Users discussion group * Auto-generated Maven Site About Language-Natural Persistence Layer for Java permazen.io/ Topics java serialization database key-value raft persistence orm-framework persistence-layer schema-management persistence-programming Resources Readme License Apache-2.0 license Activity Stars 380 stars Watchers 22 watching Forks 39 forks Report repository Releases 63 tags Packages 0 No packages published Contributors 4 * * * * Languages * HTML 86.6% * Java 12.7% * Other 0.7% Footer (c) 2023 GitHub, Inc. Footer navigation * Terms * Privacy * Security * Status * Docs * Contact GitHub * Pricing * API * Training * Blog * About You can't perform that action at this time.