Mirror of Apache Cayenne
Clone or download
Latest commit c0c1463 Dec 10, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.
assembly Updated MacOS image with customizable background Aug 27, 2018
build-tools Configure snapshot deploy to apache snapshot repo Oct 11, 2018
cayenne-ant Add logger to cgen tasks to log what config is using. Nov 15, 2018
cayenne-cache-invalidation [maven-release-plugin] prepare for next development iteration Jul 11, 2018
cayenne-cgen Rel path for template bug fix Nov 14, 2018
cayenne-client-jetty Fix javadoc Nov 13, 2018
cayenne-client Code cleanup Nov 30, 2018
cayenne-commitlog [maven-release-plugin] prepare for next development iteration Jul 11, 2018
cayenne-crypto CAY-2447 Crypto support for LocalDateTime Aug 15, 2018
cayenne-dbcp2 [maven-release-plugin] prepare for next development iteration Jul 11, 2018
cayenne-dbsync Code cleanup Nov 30, 2018
cayenne-di [maven-release-plugin] prepare for next development iteration Jul 11, 2018
cayenne-gradle-plugin Add logger to cgen tasks to log what config is using. Nov 15, 2018
cayenne-jcache cleanup Oct 8, 2018
cayenne-jgroups [maven-release-plugin] prepare for next development iteration Jul 11, 2018
cayenne-jms [maven-release-plugin] prepare for next development iteration Jul 11, 2018
cayenne-joda [maven-release-plugin] prepare for next development iteration Jul 11, 2018
cayenne-lifecycle [maven-release-plugin] prepare for next development iteration Jul 11, 2018
cayenne-osgi [maven-release-plugin] prepare for next development iteration Jul 11, 2018
cayenne-project-compatibility [maven-release-plugin] prepare for next development iteration Jul 11, 2018
cayenne-project Cgen task refactoring Nov 9, 2018
cayenne-protostuff Code cleanup Jul 27, 2018
cayenne-rop-server Code cleanup Nov 30, 2018
cayenne-server minor cleanup - a faster and more inclusive ConversionUtil checks Dec 8, 2018
cayenne-velocity Code cleanup Jul 27, 2018
cayenne-web minor cleanup - @override annotations Sep 28, 2018
cayenne-xmpp [maven-release-plugin] prepare for next development iteration Jul 11, 2018
docs Update docs Nov 9, 2018
maven-plugins Add logger to cgen tasks to log what config is using. Nov 15, 2018
modeler Modeler bug fix Dec 3, 2018
tutorials [maven-release-plugin] prepare for next development iteration Jul 11, 2018
.gitignore Update dependencies versions. Jun 7, 2017
.travis-mvn-settings.xml Enable snapshot deployment Nov 20, 2018
.travis.yml Fix snapshot deployment condition Nov 23, 2018
KEYS Move RELEASE-NOTES, UPGRADE and KEYS files to top level Jan 23, 2018
README.md readme tweaks Dec 8, 2018
RELEASE-NOTES.txt Merge PR #348 Nov 22, 2018
UPGRADE.txt Add replacement to datamap generation mode. Nov 12, 2018
pom.xml Update dependencies: mockito-core and surefire Oct 15, 2018
rat.sh Add missing licenses and add RAT ignore for **/build dirs. Jun 2, 2017


Apache Cayenne

Maven Central Build Status

Apache Cayenne Logo

Apache Cayenne is an open source persistence framework licensed under the Apache License, providing object-relational mapping (ORM) and remoting services.

Table Of Contents

Quick Start

Create XML mapping

Modeler GUI application

You can use Cayenne Modeler to manually create Cayenne project without DB. Binary distributions can be downloaded from https://cayenne.apache.org/download/


See tutorial https://cayenne.apache.org/docs/4.1/getting-started-guide/

Maven plugin

Additionally you can use Cayenne Maven (or Gradle) plugin to create model based on existing DB structure. Here is example of Cayenne Maven plugin setup that will do it:




Run it:

mvn cayenne:cdbimport
mvn cayenne:cgen

See tutorial https://cayenne.apache.org/docs/4.1/getting-started-db-first/

Gradle plugin

And here is example of Cayenne Gradle plugin setup:

buildscript {
    repositories {
    dependencies {
        classpath group: 'org.apache.cayenne.plugins', name: 'cayenne-gradle-plugin', version: '4.1.M2'
        classpath 'mysql:mysql-connector-java:6.0.5'

apply plugin: 'org.apache.cayenne'
cayenne.defaultDataMap 'demo.map.xml'

cdbimport {   
    cayenneProject 'cayenne-demo.xml'

    dataSource {
        driver 'com.mysql.cj.jdbc.Driver'
        url 'jdbc:mysql://'
        username 'user'
        password 'password'

    dbImport {
        defaultPackage = 'org.apache.cayenne.demo.model'

cgen.dependsOn cdbimport
compileJava.dependsOn cgen

Run it:

gradlew build

Include Cayenne into project

compile group: 'org.apache.cayenne', name: 'cayenne-server', version: '4.1.M2'
// or, if Gradle plugin is used
compile cayenne.dependency('server')

Create Cayenne Runtime

ServerRuntime cayenneRuntime = ServerRuntime.builder()

Create New Objects

ObjectContext context = cayenneRuntime.newContext();

Artist picasso = context.newObject(Artist.class);
picasso.setName("Pablo Picasso");
picasso.setDateOfBirth(LocalDate.of(1881, 10, 25));

Gallery metropolitan = context.newObject(Gallery.class);
metropolitan.setName("Metropolitan Museum of Art");

Painting girl = context.newObject(Painting.class);
girl.setName("Girl Reading at a Table");

Painting stein = context.newObject(Painting.class);
stein.setName("Gertrude Stein");





Select Objects
List<Painting> paintings = ObjectSelect.query(Painting.class)
        .where(Painting.ARTIST.dot(Artist.DATE_OF_BIRTH).lt(LocalDate.of(1900, 1, 1)))
Aggregate functions
// this is artificial property signaling that we want to get full object
Property<Artist> artistProperty = Property.createSelf(Artist.class);

List<Object[]> artistAndPaintingCount = ObjectSelect.columnQuery(Artist.class, artistProperty, Artist.PAINTING_ARRAY.count())
    .orderBy(Artist.PAINTING_ARRAY.count().desc(), Artist.ARTIST_NAME.asc())

for(Object[] next : artistAndPaintingCount) {
    Artist artist = (Artist)next[0];
    long paintingsCount = (Long)next[1];
    System.out.println(artist.getArtistName() + " has " + paintingsCount + " painting(s)");
Raw SQL queries
// Selecting objects
List<Painting> paintings = SQLSelect
    .query(Painting.class, "SELECT * FROM PAINTING WHERE PAINTING_TITLE LIKE #bind($title)")
    .params("title", "painting%")

// Selecting scalar values
List<String> paintingNames = SQLSelect
    .scalarQuery(String.class, "SELECT PAINTING_TITLE FROM PAINTING WHERE ESTIMATED_PRICE > #bind($price)")
    .params("price", 100000)

// Insert values
int inserted = SQLExec
    .query("INSERT INTO ARTIST (ARTIST_ID, ARTIST_NAME) VALUES (#bind($id), #bind($name))")
    .paramsArray(55, "Picasso")


Getting Started


Getting Started Db-First


Full documentation





With a wealth of unique and powerful features, Cayenne can address a wide range of persistence needs. Cayenne seamlessly binds one or more database schemas directly to Java objects, managing atomic commit and rollbacks, SQL generation, joins, sequences, and more. With Cayenne's Remote Object Persistence, those Java objects can even be persisted out to clients via Web Services.

Cayenne is designed to be easy to use, without sacrificing flexibility or design. To that end, Cayenne supports database reverse engineering and generation, as well as a Velocity-based class generation engine. All of these functions can be controlled directly through the CayenneModeler, a fully functional GUI tool. No cryptic XML or annotation based configuration is required! An entire database schema can be mapped directly to Java objects within minutes, all from the comfort of the GUI-based CayenneModeler.

Cayenne supports numerous other features, including caching, a complete object query syntax, relationship pre-fetching, on-demand object and relationship faulting, object inheritance, database auto-detection, and generic persisted objects. Most importantly, Cayenne can scale up or down to virtually any project size. With a mature, 100% open source framework, an energetic user community, and a track record of solid performance in high-volume environments, Cayenne is an exceptional choice for persistence services.



Cayenne is available as free and open source under the Apache License, Version 2.0.