blob: 1ac2af2e33c78a03d26dfa074a4d76d4e73728d6 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.3">
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicon/apple-touch-icon-04cb17e028.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicon/favicon-32x32-12431ee8eb.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicon/favicon-16x16-4f316e4d55.png">
<link rel="manifest" href="/img/favicon/manifest-65e6aaa49e.json">
<link rel="mask-icon" href="/img/favicon/safari-pinned-tab-558c1991b1.svg" color="#dc5656">
<link rel="shortcut icon" href="/img/favicon/favicon-6cef91375b.ico">
<meta name="msapplication-TileColor" content="#ffffff">
<meta name="msapplication-TileImage" content="/img/favicon/mstile-144x144-34e7696278.png">
<meta name="msapplication-config" content="/img/favicon/browserconfig-82ff158058.xml">
<meta name="theme-color" content="#ffffff">
<link rel="stylesheet" href="https://cayenne.apache.org/css/styles-9ee2e6e330.css"/>
<script src="https://cayenne.apache.org/js/bundle-c0e6356367.js"></script>
<title>Guide to 4.1 Features &middot; Apache Cayenne</title>
</head>
<body data-spy="scroll" data-target=".toc-side" class="cd-head">
<header class="page-header">
<nav id="topbar" class="bg-dark" aria-label="breadcrumb" role="navigation">
<ul class="breadcrumb breadcrumb-sm breadcrumb-dark container mb-0">
<li class="breadcrumb-item dropdown">
<a class="dropdown-toggle text-nowrap pr-1" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<img class="mw-15px mr-1" src="/img/feather-641aa69d09.svg" />Apache Software Foundation</a>
<div class="dropdown-menu rounded-0" aria-labelledby="navbarDropdown">
<a class="dropdown-item" href="https://www.apache.org">Apache Homepage</a>
<a class="dropdown-item" href="https://www.apache.org/licenses/">License</a>
<a class="dropdown-item" href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
<a class="dropdown-item" href="https://www.apache.org/foundation/thanks.html">Thanks</a>
<a class="dropdown-item" href="https://www.apache.org/security/">Security</a>
<a class="dropdown-item" href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy</a>
<a class="ml-1 mt-1 acevent" data-format="wide" data-mode="dark" data-width="120"></a>
</div>
</li>
</ul>
</nav>
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
<div class="container">
<a class="navbar-brand" href="https://cayenne.apache.org/">
<img src="/img/logo_mono_full-d7a19eef61.svg" alt="Apache Cayenne" />
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#mainMenu" aria-controls="mainMenu" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="mainMenu">
<ul class="navbar-nav mt-3 mt-lg-0 mr-auto">
<li class="nav-item">
<a class="nav-link" href="/download/">DOWNLOAD</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/docs/4.2/getting-started-guide/">DOCUMENTATION</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/about/support/">SUPPORT</a>
</li>
</ul>
<ul class="navbar-nav flex-row justify-content-center mt-2 mt-lg-0 mb-2 mb-lg-0 " id="social-links-menu">
<li class="nav-item d-flex">
<a class="nav-link d-flex justify-content-center align-items-center" href="https://github.com/apache/cayenne">
<img src="/img/icon_octocat_stars-c24dac94b8.svg" alt="GitHub" />
</a>
</li>
<li class="nav-item d-flex">
<a class="nav-link d-flex justify-content-center align-items-center" href="https://twitter.com/ApacheCayenne">
<img src="/img/icon_twitter-220a129d14.svg" alt="Twitter" />
</a>
</li>
</ul>
</div>
</div>
</nav>
</header>
<main>
<div class="cd-top-sidebar bb">
<div class="container">
<div class="row no-gutters">
<div class="col-12 col-lg-4 col-xl-3 br cd-sidebar1">
<ul class="nav" role="tablist">
<li class="nav-item dropdown mw-100">
<a class="nav-link dropdown-toggle text-truncate" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">
Cayenne Version 4.1
</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="/docs/5.0/cayenne-guide/">Version 5.0 (Alpha)</a><a class="dropdown-item" href="/docs/4.2/getting-started-guide/">Version 4.2 (Stable)</a><a class="dropdown-item" href="/docs/4.1/getting-started-guide/">Version 4.1 (Stable)</a><a class="dropdown-item" href="/docs/4.0/getting-started-guide/">Version 4.0 (Aging)</a><a class="dropdown-item" href="/docs/3.1/getting-started-guide/">Version 3.1 (Legacy)</a>
</div>
</li>
</ul>
</div>
<div class="col-12 col-lg-8 col-xl-9"> </div>
</div>
</div>
</div>
<div class="container">
<div class="row no-gutters ">
<div class="col-12 col-lg-4 col-xl-3 br py-2 bg-gray-100 cd-sidebar">
<div class="tab-content" id="cd-docs-nav">
<div class="cd-toc-item">
<a class="cd-toc-link" href="/docs/4.1/getting-started-guide/">Getting Started</a>
</div>
<div class="cd-toc-item">
<a class="cd-toc-link" href="/docs/4.1/cayenne-guide/">Cayenne Guide</a>
</div>
<div class="cd-toc-item">
<a class="cd-toc-link" href="/docs/4.1/getting-started-db-first/">Database First Tutorial</a>
</div>
<div class="cd-toc-item">
<a class="cd-toc-link" href="/docs/4.1/getting-started-rop/">Getting Started ROP</a>
</div>
<div class="cd-toc-item">
<span class="cd-toc-link active">Upgrade Guide</span><div id="toc" class="toc toc-side">
<div id="toctitle">
Table of Contents
</div>
<ul class="sectlevel1 nav">
<li><a href="#java-version" class="nav-link">1. Java Version</a></li>
<li><a href="#new-features" class="nav-link">2. New Features</a>
<ul class="sectlevel2 nav">
<li><a href="#cayenne-core-is-dependency-free" class="nav-link">2.1. Cayenne Core is Dependency-Free</a></li>
<li><a href="#field-based-data-objects" class="nav-link">2.2. Field-Based Data Objects</a></li>
<li><a href="#extensible-project-xml-structure" class="nav-link">2.3. Extensible Project XML Structure</a></li>
</ul> </li>
<li><a href="#api-changes" class="nav-link">3. API Changes</a>
<ul class="sectlevel2 nav">
<li><a href="#transaction-propagation-logic-and-isolation-level" class="nav-link">3.1. Transaction propagation logic and isolation level</a></li>
<li><a href="#injectable-pkgenerator" class="nav-link">3.2. Injectable PkGenerator</a></li>
<li><a href="#datachannelfilter-replaced-with-datachannelqueryfilter-and-datachannelsyncfilter" class="nav-link">3.3. DataChannelFilter replaced with DataChannelQueryFilter and DataChannelSyncFilter</a></li>
</ul> </li>
</ul>
</div>
</div>
<div class="cd-toc-item">
<a class="cd-toc-link" href="/docs/4.1/api/">JavaDoc</a></div>
</div>
</div>
<div class="col-12 col-lg-8 col-xl-9 py-3 pl-lg-5 cd-content">
<article>
<header>
<h1>Guide to 4.1 Features</h1>
</header>
<section>
<div class="sect1">
<h2 id="java-version"><a class="anchor" href="#java-version"></a>1. Java Version</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Minimum required JDK version is 1.8 or newer. Cayenne 4.1 is fully tested with Java 1.8 and 11.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="new-features"><a class="anchor" href="#new-features"></a>2. New Features</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="cayenne-core-is-dependency-free"><a class="anchor" href="#cayenne-core-is-dependency-free"></a>2.1. Cayenne Core is Dependency-Free</h3>
<div class="paragraph">
<p>Cayenne now depends only on <code>slf4j-api</code> library. We removed <code>velocity</code>, <code>commons-lang</code> and <code>commons-collections</code> dependencies from the Cayenne core. Velocity templates replaced with a simplified (and also much faster) parser for the parts of the Velocity syntax essential for Cayenne.</p>
</div>
<div class="paragraph">
<p>This should be transparent in almost all case. See <code>UPGRADE.txt</code> for details.</p>
</div>
</div>
<div class="sect2">
<h3 id="field-based-data-objects"><a class="anchor" href="#field-based-data-objects"></a>2.2. Field-Based Data Objects</h3>
<div class="paragraph">
<p>Cayenne <strong>4.1</strong> generates field-based DataObjects by default. And it is HUGE for the app performance. The new objects are much faster to read and write and significantly reduce the overall app memory footprint and the corresponding GC pauses.</p>
</div>
<div class="paragraph">
<p>The new objects are mostly backwards-compatible with our “classic” map-based objects from the application standpoint. The main source of incompatibility is support for “dynamic” properties (i.e. persistent properties not known at compile time).</p>
</div>
<div class="paragraph">
<p>Field-based DataObjects are generated via new class templates. So to take advantage of this feature you should simply regenerate you model classes.</p>
</div>
</div>
<div class="sect2">
<h3 id="extensible-project-xml-structure"><a class="anchor" href="#extensible-project-xml-structure"></a>2.3. Extensible Project XML Structure</h3>
<div class="paragraph">
<p>Cayenne mapping project structure was modularized, allowing embedding of extensions with their own XML schemas. This enables support for comments for entities, attributes and relationships. Also Cayenne 4.1 have extensions for cdbimport and cgen, making OR modeling workflow experience so much smoother.</p>
</div>
<div class="imageblock" style="text-align: center">
<div class="content">
<img src="images/modeler-dbimport.png" alt="modeler dbimport">
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="api-changes"><a class="anchor" href="#api-changes"></a>3. API Changes</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="transaction-propagation-logic-and-isolation-level"><a class="anchor" href="#transaction-propagation-logic-and-isolation-level"></a>3.1. Transaction propagation logic and isolation level</h3>
<div class="paragraph">
<p>New API allows to fully control transaction behavior where it’s needed.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java java" data-lang="java">TransactionManager manager = runtime.getInjector().getInstance(TransactionManager.class);
TransactionDescriptor descriptor = new TransactionDescriptor(
Connection.TRANSACTION_SERIALIZABLE, // set transaction isolation to SERIALIZABLE
TransactionPropagation.REQUIRES_NEW // require new transaction for every operation
);
manager.performInTransaction(() -&gt; {
// perform some DB operations...
return null;
}, descriptor);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="injectable-pkgenerator"><a class="anchor" href="#injectable-pkgenerator"></a>3.2. Injectable PkGenerator</h3>
<div class="paragraph">
<p>All <code>PkGenerators</code> are now managed by DI so you can simply inject your own implementation.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java java" data-lang="java">ServerModule.contributePkGenerators(binder)
.put(MySQLAdapter.class.getName(), CustomSQLPkGenerator.class);</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="datachannelfilter-replaced-with-datachannelqueryfilter-and-datachannelsyncfilter"><a class="anchor" href="#datachannelfilter-replaced-with-datachannelqueryfilter-and-datachannelsyncfilter"></a>3.3. DataChannelFilter replaced with DataChannelQueryFilter and DataChannelSyncFilter</h3>
<div class="paragraph">
<p><code>DataChannelFilter</code> is deprecated. Instead two separate filters are introduced.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java java" data-lang="java">ServerModule.contributeDomainQueryFilters(binder).add((context, query, chain) -&gt; {
// do something with query
// ...
return chain.onQuery(context, query);
});
ServerModule.contributeDomainSyncFilters(binder).add((context, changes, syncType, chain) -&gt; {
// do something with changes
// ...
return chain.onSync(context, changes, syncType);
});</code></pre>
</div>
</div>
</div>
</div>
</div>
</section>
<footer>
<div class="row">
<div class="col-6 col-md-3 text-center text-md-left">
&nbsp;
</div>
<div class="col-18 col-md-9 text-center text-md-right">
</div>
</div>
</footer>
</article>
<img referrerpolicy="no-referrer-when-downgrade" src="https://static.scarf.sh/a.png?x-pxid=5c836e39-be6b-4a21-a946-a97b5b69f172" />
</div>
</div>
</div>
</main>
<footer class="bg-dark">
<div class="footer-nav container text-center text-lg-left pb-3">
<div class="row pt-5 pb-3">
<div class="col-sm-6 col-lg-3">
<h4>About</h4>
<ul class="list-unstyled">
<li>
<a href="/why-cayenne.html">Why Cayenne?</a>
</li>
<li>
<a href="/download/">Download</a>
</li>
<li>
<a href="/success-stories.html">Success Stories</a>
</li>
<li>
<a href="/about/support/">Support</a>
</li>
</ul>
</div>
<div class="col-sm-6 col-lg-3">
<h4>Documentation</h4>
<ul class="list-unstyled">
<li>
<a href="/docs/4.0/getting-started-guide/">Getting Started (4.0)</a>
</li>
<li>
<a href="/docs/4.1/getting-started-guide/">Getting Started (4.1)</a>
</li>
<li>
<a href="/docs/4.2/getting-started-guide/">Getting Started (4.2)</a>
</li>
<li>
<a href="/docs/4.0/cayenne-guide/">Cayenne Guide (4.0)</a>
</li>
<li>
<a href="/docs/4.1/cayenne-guide/">Cayenne Guide (4.1)</a>
</li>
<li>
<a href="/docs/4.2/cayenne-guide/">Cayenne Guide (4.2)</a>
</li>
<li>
<a href="/docs/4.1/getting-started-db-first/">Database First tutorial (4.1)</a>
</li>
<li>
<a href="/docs/4.2/getting-started-db-first/">Database First tutorial (4.2)</a>
</li>
<li>
<a href="/legacy/legacy-docs/">Legacy Documentation</a>
</li>
</ul>
</div>
<div class="col-sm-6 col-lg-3">
<h4>Collaboration</h4>
<ul class="list-unstyled">
<li>
<a href="https://issues.apache.org/jira/browse/CAY">Bug/Feature Tracker</a>
</li>
<li>
<a href="/mailing-lists.html">Mailing Lists</a>
</li>
<li>
<a href="/dev/code-repository.html">Code Repository</a>
</li>
<li>
<a href="/dev/">Developer Guide</a>
</li>
<li>
<a href="/how-can-i-help.html">How can I help?</a>
</li>
<li>
<a href="/contributors.html">Contributors</a>
</li>
<li>
<a href="/thanks.html">Thanks</a>
</li>
</ul>
</div>
<div class="col-sm-6 col-lg-3">
<h4>News</h4>
<ul class="list-multiline-items list-unstyled mb-0">
<li>
<time datetime="2023-05-25 18:00:00 &#43;0300 &#43;0300" class="xsmall d-block">May 25, 2023</time>
<a href="/2023/05/cayenne-42-final-released/">Cayenne 4.2 Final Released</a>
</li>
<li>
<time datetime="2023-03-02 12:00:00 &#43;0300 &#43;0300" class="xsmall d-block">Mar 02, 2023</time>
<a href="/2023/03/cayenne-403-released/">Cayenne 4.0.3 Released</a>
</li>
<li>
<time datetime="2022-12-05 12:00:00 &#43;0300 &#43;0300" class="xsmall d-block">Dec 05, 2022</time>
<a href="/2022/12/cayenne-42rc2-released/">Cayenne 4.2 Release Candidate 2 Released</a>
</li>
</ul>
<a class="btn-link text-uppercase xsmall" href="https://cayenne.apache.org/news">
More news
<i class="fa fa-lg fa-long-arrow-right" aria-hidden="true"></i>
</a>
</div>
</div>
<hr class="mt-0 mb-3" />
<p class="copy xsmall text-center mw-75 mx-auto mb-0">
Copyright © 2001-2024 Apache Software Foundation. Apache Cayenne, Cayenne, Apache, the Apache feather logo, and the Apache Cayenne project logo are trademarks of The Apache Software Foundation.
<a href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy policy</a>.
<img class="d-block mx-auto mt-2" src="/img/logo_mono-3302daa3cf.svg" alt="Apache Cayenne" />
</p>
</div>
</footer>
</body>
</html>