MCPcopy Index your code
hub / github.com/apache/cayenne

github.com/apache/cayenne @5.0-M2

Chat with this repo
repository ↗ · DeepWiki ↗ · release 5.0-M2 ↗ · + Follow
30,005 symbols 128,362 edges 3,797 files 6,038 documented · 20%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Apache Cayenne

Maven Central Build Status

Apache Cayenne is an open source persistence framework for Java. 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 to Java objects, managing atomic commits and rollbacks, SQL generation, joins, sequences, and more.

Cayenne supports database reverse engineering and generation, as well as templated class generation. All of these functions can be controlled through the GUI CayenneModeler app. 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, an object query syntax, relationship pre-fetching, on-demand object and relationship faulting, object inheritance, database auto-detection, and generic persistent objects. Cayenne can scale up or down to virtually any project size.

Quick Links

Quick Start

Create XML Mapping

Downloaded Cayenne Modeler from https://cayenne.apache.org/download/, start it and create a Cayenne project.

Include Cayenne in a Project

Maven

<dependencies>
    <dependency>
        <groupId>org.apache.cayenne</groupId>
        <artifactId>cayenne-server</artifactId>
        <version>5.0-M1</version>
    </dependency>
</dependencies>

Gradle

compile group: 'org.apache.cayenne', name: 'cayenne-server', version: '5.0-M1'

// or, if Gradle plugin is used
compile cayenne.dependency('server')

Create Cayenne Runtime

CayenneRuntime cayenneRuntime = CayenneRuntime.builder()
    .addConfig("cayenne-demo.xml")
    .dataSource(DataSourceBuilder
             .url("jdbc:mysql://localhost:3306/cayenne_demo")
             .driver("com.mysql.cj.jdbc.Driver")
             .userName("username")
             .password("password")
             .build())
    .build();

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");

picasso.addToPaintings(girl);
picasso.addToPaintings(stein);

girl.setGallery(metropolitan);
stein.setGallery(metropolitan);

context.commitChanges();

Queries

Select Objects

List<Painting> paintings = ObjectSelect.query(Painting.class)
        .where(Painting.ARTIST.dot(Artist.DATE_OF_BIRTH).year().lt(1900))
        .prefetch(Painting.ARTIST.joint())
        .select(context);

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())
    .where(Artist.ARTIST_NAME.like("a%"))
    .having(Artist.PAINTING_ARRAY.count().lt(5L))
    .orderBy(Artist.PAINTING_ARRAY.count().desc(), Artist.ARTIST_NAME.asc())
    .select(context);

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%")
    .upperColumnNames()
    .localCache()
    .limit(100)
    .select(context);

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

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

Collaboration and Support

Extension points exported contracts — how you extend this code

ConfigurationNodeParentGetter (Interface)
A service to retrieve parents of configuration nodes. @since 3.1 [19 implementers]
cayenne-project/src/main/java/org/apache/cayenne/project/ConfigurationNodeParentGetter.java
JCacheConfigurationFactory (Interface)
JCache configuration factory @see JCacheDefaultConfigurationFactory default implementation @since 4.0 [11 implementers]
cayenne-jcache/src/main/java/org/apache/cayenne/jcache/JCacheConfigurationFactory.java
Builder (Interface)
Base interface for all domain builders [6 implementers]
cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/builders/Builder.java
Module (Interface)
Represents a unit of configuration of the Cayenne DI container. @since 3.1 [54 implementers]
cayenne-di/src/main/java/org/apache/cayenne/di/Module.java
CMFileChooserFactory (Interface)
Platform-specific factory for CMFileChooser instances. [10 implementers]
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/CMFileChooserFactory.java
Artifact (Interface)
Represents a class generation "artifact" which is a facade to a metadata object used for a given single generation templ [6 …
cayenne-cgen/src/main/java/org/apache/cayenne/gen/Artifact.java
ResultIteratorCallback (Interface)
A callback interface invoked on each row when iterating over ResultIterator. This simplifies iterator management [30 implementers]
cayenne/src/main/java/org/apache/cayenne/ResultIteratorCallback.java
TransformerFactory (Interface)
A factory that creates encryption transformers used for processing batch bindings and decryption transformers - for resu [9 …
cayenne-crypto/src/main/java/org/apache/cayenne/crypto/transformer/TransformerFactory.java

Core symbols most depended-on inside this repo

get
called by 2079
cayenne/src/main/java/org/apache/cayenne/cache/QueryCache.java
append
called by 2079
cayenne/src/main/java/org/apache/cayenne/access/sqlbuilder/QuotingAppendable.java
size
called by 1793
cayenne/src/main/java/org/apache/cayenne/QueryResult.java
getName
called by 1735
cayenne/src/main/java/org/apache/cayenne/reflect/Accessor.java
add
called by 1217
cayenne-di/src/main/java/org/apache/cayenne/di/ListBuilder.java
query
called by 954
cayenne/src/main/java/org/apache/cayenne/query/ObjectSelect.java
newObject
called by 938
cayenne/src/main/java/org/apache/cayenne/ObjectContext.java
equals
called by 800
cayenne/src/main/java/org/apache/cayenne/access/types/ValueObjectType.java

Shape

Method 25,804
Class 3,839
Interface 299
Enum 63

Languages

Java100%

Modules by API surface

cayenne/src/main/java/org/apache/cayenne/util/concurrentlinkedhashmap/ConcurrentLinkedHashMap.java161 symbols
cayenne/src/test/java/org/apache/cayenne/unit/jdbc/TestResultSet.java129 symbols
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/project/ProjectSession.java117 symbols
cayenne/src/main/java/org/apache/cayenne/dba/oracle/OracleResultSetWrapper.java98 symbols
cayenne/src/main/java/org/apache/cayenne/ejbql/EJBQLBaseVisitor.java93 symbols
cayenne/src/main/java/org/apache/cayenne/ejbql/EJBQLExpressionVisitor.java92 symbols
cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/CgenTask.java81 symbols
cayenne/src/main/java/org/apache/cayenne/map/DataMap.java77 symbols
cayenne/src/main/java/org/apache/cayenne/access/DataContext.java75 symbols
cayenne/src/test/java/org/apache/cayenne/query/ColumnSelectIT.java73 symbols
cayenne/src/main/java/org/apache/cayenne/query/SelectById.java68 symbols
cayenne/src/main/java/org/apache/cayenne/exp/parser/ExpressionParser.java68 symbols

Datastores touched

(mysql)Database · 1 repos
mydbDatabase · 1 repos
cayenne_demoDatabase · 1 repos
cayenneDatabase · 1 repos

For agents

$ claude mcp add cayenne \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact