blob: 17f2413c08bd8609f710205101054abdfddce81a [file]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>@DomainObject :: causeway</title>
<link rel="canonical" href="https://causeway.apache.org/refguide/latest/applib/index/annotation/DomainObject.html">
<meta name="generator" content="Antora 3.1.14">
<link rel="stylesheet" href="../../../../../_/css/site.css">
<link rel="stylesheet" href="../../../../../_/css/site-custom.css">
<link rel="home" href="https://causeway.apache.org" title="causeway">
</head>
<body class="article">
<header class="header">
<nav class="navbar">
<div class="navbar-brand">
<a class="navbar-item" href="https://causeway.apache.org">
<span class="icon">
<img src="../../../../../_/img/causeway-logo-no-words-65x48.png"></img>
</span>
<span class="navbar-title">causeway</span>
</a>
<button class="navbar-burger" data-target="topbar-nav">
<span></span>
<span></span>
<span></span>
</button>
</div>
<div id="topbar-nav" class="navbar-menu">
<a class="navbar-end">
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">Quick Start</a>
<div class="navbar-dropdown">
<span class="navbar-item navbar-heading">Starter Apps</span>
<a class="navbar-item" href="../../../../../docs/latest/starters/helloworld.html">Hello World</a>
<a class="navbar-item" href="../../../../../docs/latest/starters/simpleapp.html">Simple App</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Learning &amp; Tutorials</span>
<a class="navbar-item" href="../../../../../docs/latest/reference/about.html">Reference App</a>
<a class="navbar-item" href="https://danhaywood.gitlab.io/isis-petclinic-tutorial-docs/petclinic/1.16.2/intro.html">Petclinic</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Resources</span>
<a class="navbar-item" href="../../../../../docs/latest/resources/cheatsheet.html">Cheatsheet</a>
<a class="navbar-item" href="../../../../../docs/latest/resources/icons.html">Icons</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">Guides</a>
<div class="navbar-dropdown">
<span class="navbar-item navbar-heading">Core</span>
<a class="navbar-item" href="../../../../../userguide/latest/about.html">User Guide</a>
<a class="navbar-item" href="../../../../../refguide/latest/about.html">Reference Guide</a>
<a class="navbar-item" href="../../../../../testing/latest/about.html">Testing Guide</a>
<a class="navbar-item" href="../../../../../security/latest/about.html">Security Guide</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">For use in apps</span>
<a class="navbar-item" href="../../../../../valuetypes/latest/about.html">Value Types</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Development</span>
<a class="navbar-item" href="../../../../../setupguide/latest/about.html">Setup Guide</a>
<a class="navbar-item" href="../../../../../conguide/latest/about.html">Contributors' Guide</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">Components</a>
<div class="navbar-dropdown">
<span class="navbar-item navbar-heading">Security</span>
<a class="navbar-item" href="../../../../../security/latest/bypass/about.html">Bypass</a>
<a class="navbar-item" href="../../../../../security/latest/simple/about.html">Simple</a>
<a class="navbar-item" href="../../../../../security/latest/spring/about.html">Spring</a>
<a class="navbar-item" href="../../../../../security/latest/keycloak/about.html">Keycloak</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Viewers</span>
<a class="navbar-item" href="../../../../../vw/latest/about.html">Web UI (Wicket)</a>
<a class="navbar-item" href="../../../../../gqlv/latest/about.html">GraphQL API</a>
<a class="navbar-item" href="../../../../../vro/latest/about.html">REST API (Restful Objects)</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Persistence</span>
<a class="navbar-item" href="../../../../../pjpa/latest/about.html">JPA (EclipseLink)</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">Extensions</a>
<div class="navbar-dropdown">
<span class="navbar-item navbar-heading">Core</span>
<a class="navbar-item" href="../../../../../userguide/latest/commandlog/about.html">Command Log</a>
<a class="navbar-item" href="../../../../../userguide/latest/docgen/about.html">Doc Gen</a>
<a class="navbar-item" href="../../../../../userguide/latest/executionlog/about.html">Execution Log</a>
<a class="navbar-item" href="../../../../../userguide/latest/executionoutbox/about.html">Execution Outbox</a>
<a class="navbar-item" href="../../../../../userguide/latest/executionrepublisher/about.html">Execution Republisher</a>
<a class="navbar-item" href="../../../../../userguide/latest/excel/about.html">Excel</a>
<a class="navbar-item" href="../../../../../userguide/latest/flyway/about.html">Flyway</a>
<a class="navbar-item" href="../../../../../userguide/latest/layoutloaders/about.html">Layout Loaders</a>
<a class="navbar-item" href="../../../../../userguide/latest/titlecache/about.html">Title Cache</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Security</span>
<a class="navbar-item" href="../../../../../security/latest/secman/about.html">Secman</a>
<a class="navbar-item" href="../../../../../security/latest/audittrail/about.html">Audit Trail</a>
<a class="navbar-item" href="../../../../../security/latest/spring-oauth2/about.html">Spring OAuth2 Integration</a>
<a class="navbar-item" href="../../../../../security/latest/sessionlog/about.html">Session Log</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Web UI (Wicket)</span>
<a class="navbar-item" href="../../../../../vw/latest/fullcalendar/about.html">Full Calendar</a>
<a class="navbar-item" href="../../../../../vw/latest/pdfjs/about.html">pdf.js</a>
<a class="navbar-item" href="../../../../../vw/latest/sse/about.html">Server Side Events</a>
<a class="navbar-item" href="../../../../../vw/latest/tabular/about.html">Tabular Download</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">REST API (Restful Objects)</span>
<a class="navbar-item" href="../../../../../vro/latest/cors/about.html">CORS</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Persistence</span>
<a class="navbar-item" href="../../../../../querydsl/latest/about.html">QueryDSL</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">Support</a>
<div class="navbar-dropdown">
<span class="navbar-item navbar-heading">Contact</span>
<a class="navbar-item" href="../../../../../docs/latest/support/slack-channel.html">Slack</a>
<a class="navbar-item" href="../../../../../docs/latest/support/mailing-list.html">Mailing Lists</a>
<a class="navbar-item" href="https://issues.apache.org/jira/browse/CAUSEWAY">JIRA</a>
<a class="navbar-item" href="https://stackoverflow.com/questions/tagged/causeway">Stack Overflow</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Releases</span>
<a class="navbar-item" href="../../../../../docs/latest/downloads/how-to.html">Downloads</a>
<a class="navbar-item" href="../../../../../relnotes/latest/about.html">Release Notes</a>
<hr class="navbar-divider"/>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">Framework</a>
<div class="navbar-dropdown">
<span class="navbar-item navbar-heading">Process</span>
<a class="navbar-item" href="../../../../../comguide/latest/about.html">Committers' Guide</a>
<a class="navbar-item" href="../../../../../tooling/latest/about.html">Tooling</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Automated Analysis</span>
<a class="navbar-item" href="https://sonarcloud.io/dashboard?id=apache_causeway">SonarCloud.io</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Interim Builds</span>
<a class="navbar-item" href="../../../../../comguide/latest/nightly-builds.html">Nightly builds</a>
<a class="navbar-item" href="../../../../../comguide/latest/weekly-builds.html">Weekly builds</a>
<a class="navbar-item" href="https://apache-causeway-committers.github.io/causeway-nightly">Website Preview (not ASF hosted)</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Development</span>
<a class="navbar-item" href="../../../../../core/latest/about.html">Internal Design Docs</a>
<a class="navbar-item" href="../../../../../regressiontests/latest/about.html">Regression Tests</a>
<a class="navbar-item" href="../../../../../incubator/latest/about.html">Incubator</a>
<hr class="navbar-divider"/>
<span class="navbar-item navbar-heading">Thanks</span>
<a class="navbar-item" href="../../../../../more-thanks/latest/more-thanks.html">Acknowledgements</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="#">ASF</a>
<div class="navbar-dropdown">
<a class="navbar-item" href="http://www.apache.org/">Apache Homepage</a>
<a class="navbar-item" href="https://www.apache.org/events/current-event">Events</a>
<a class="navbar-item" href="https://www.apache.org/licenses/">License</a>
<a class="navbar-item" href="https://www.apache.org/security/">Security</a>
<a class="navbar-item" href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy</a>
<a class="navbar-item" href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
<a class="navbar-item" href="https://www.apache.org/foundation/thanks.html">Thanks</a>
<hr class="navbar-divider"/>
<a class="navbar-item" href="https://whimsy.apache.org/board/minutes/Causeway.html">PMC board minutes</a>
</div>
</div>
<a class="navbar-item" href="../../../../../docs/latest/about.html">
<span class="icon">
<img src="../../../../../_/img/home.png"></img>
</span>
</a>
</div>
</div>
</nav>
</header>
<div class="body ">
<div class="nav-container" data-component="refguide" data-version="3.1.0">
<aside class="nav">
<div class="panels">
<div class="nav-panel-search hide-for-print">
<input id="algolia-search-input" placeholder="Search"></span>
</div>
<div class="nav-panel-pagination">
<a class="page-previous disabled" rel="prev" href="" title=""><span></span></a>
<a class="page-next disabled" rel="next"
href="" title=""><span></span></a>
<!--
page.parent doesn't seem to be set...
<a class="page-parent disabled" rel="prev" href="" title=""><span></span></a>
-->
</div>
<div class="nav-panel-menu is-active" data-panel="menu">
<nav class="nav-menu">
<h3 class="title"><a href="../../../about.html">Reference Guide</a></h3>
<ul class="nav-list">
<li class="nav-item" data-depth="0">
<ul class="nav-list">
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../latest/applib-svc/about.html">Domain Services</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/acceptheader/AcceptHeaderService.html">AcceptHeaderService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/appfeatui/ApplicationFeatureMenu.html">ApplicationFeatureMenu</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/appfeat/ApplicationFeatureRepository.html">ApplicationFeatureRepository</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/bookmark/BookmarkService.html">BookmarkService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/bookmarkui/BookmarkUiService.html">BookmarkUiService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/clock/ClockService.html">ClockService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/commanddto/processor/spi/CommandDtoProcessorService.html">CommandDtoProcessorService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/command/CommandExecutorService.html">CommandExecutorService</a>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../latest/applib/index/services/publishing/spi/CommandSubscriber.html">CommandSubscriber</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib/index/services/publishing/log/CommandLogger.html">CommandLogger</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/confview/ConfigurationMenu.html">ConfigurationMenu</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/confview/ConfigurationViewService.html">ConfigurationViewService</a>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../latest/applib/index/services/conmap/ContentMappingService.html">ContentMappingService</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib/index/services/commanddto/conmap/ContentMappingServiceForCommandDto.html">ContentMappingServiceForCommandDto</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib/index/services/commanddto/conmap/ContentMappingServiceForCommandsDto.html">ContentMappingServiceForCommandsDto</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/linking/DeepLinkService.html">DeepLinkService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/userreg/EmailNotificationService.html">EmailNotificationService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/email/EmailService.html">EmailService</a>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../latest/applib/index/services/publishing/spi/EntityChangesSubscriber.html">EntityChangesSubscriber</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib/index/services/publishing/log/EntityChangesLogger.html">EntityChangesLogger</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../latest/applib/index/services/publishing/spi/EntityPropertyChangeSubscriber.html">EntityPropertyChangeSubscriber</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib/index/services/publishing/log/EntityPropertyChangeLogger.html">EntityPropertyChangeLogger</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../latest/applib/index/services/publishing/spi/ExecutionSubscriber.html">ExecutionSubscriber</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib/index/services/publishing/log/ExecutionLogger.html">ExecutionLogger</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/error/ErrorReportingService.html">ErrorReportingService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/eventbus/EventBusService.html">EventBusService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/exceprecog/ExceptionRecognizerService.html">ExceptionRecognizerService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/factory/FactoryService.html">FactoryService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/grid/GridLoaderService.html">GridLoaderService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/grid/GridService.html">GridService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/grid/GridSystemService.html">GridSystemService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/health/HealthCheckService.html">HealthCheckService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/hint/HintIdProvider.html">HintIdProvider</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/hint/HintStore.html">HintStore</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/homepage/HomePageResolverService.html">HomePageResolverService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/bookmark/IdStringifier.html">IdStringifier</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/user/ImpersonateMenu.html">ImpersonateMenu</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/user/ImpersonateMenuAdvisor.html">ImpersonateMenuAdvisor</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/iactn/InteractionProvider.html">InteractionProvider</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/iactnlayer/InteractionLayerTracker.html">InteractionLayerTracker</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/iactnlayer/InteractionService.html">InteractionService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/jaxb/JaxbService.html">JaxbService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/layout/LayoutService.html">LayoutService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/layout/LayoutServiceMenu.html">LayoutServiceMenu</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/i18n/LanguageProvider.html">LanguageProvider</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/locale/LocaleChoiceProvider.html">LocaleChoiceProvider</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/menu/MenuBarsLoaderService.html">MenuBarsLoaderService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/menu/MenuBarsService.html">MenuBarsService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/message/MessageService.html">MessageService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/metamodel/MetaModelService.html">MetaModelService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/metamodel/MetaModelServiceMenu.html">MetaModelServiceMenu</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/metrics/MetricsService.html">MetricsService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/queryresultscache/QueryResultsCache.html">QueryResultsCache</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/repository/RepositoryService.html">RepositoryService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/routing/RoutingService.html">RoutingService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/scratchpad/Scratchpad.html">Scratchpad</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/inject/ServiceInjector.html">ServiceInjector</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/registry/ServiceRegistry.html">ServiceRegistry</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/session/SessionSubscriber.html">SessionSubscriber</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/sitemap/SitemapService.html">SitemapService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/sitemap/SitemapServiceMenu.html">SitemapServiceMenu</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/sudo/SudoService.html">SudoService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/swagger/SwaggerService.html">SwaggerService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/tablecol/TableColumnOrderService.html">TableColumnOrderService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/tablecol/TableColumnVisibilityService.html">TableColumnVisibilityService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/title/TitleService.html">TitleService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/i18n/TranslationService.html">TranslationService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/i18n/TranslationsResolver.html">TranslationsResolver</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/xactn/TransactionalProcessor.html">TransactionProcessor</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/xactn/TransactionService.html">TransactionService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/urlencoding/UrlEncodingService.html">UrlEncodingService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/userui/UserMenu.html">UserMenu</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/userreg/UserRegistrationService.html">UserRegistrationService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/user/UserService.html">UserService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/wrapper/WrapperFactory.html">WrapperFactory</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/xml/XmlService.html">XmlService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/services/xmlsnapshot/XmlSnapshotService.html">XmlSnapshotService</a>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<span class="nav-text">Core Transaction</span>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/core/index/transaction/changetracking/EntityChangeTracker.html">EntityChangeTracker</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/core/index/transaction/changetracking/EntityChangesPublisher.html">EntityChangesPublisher</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<span class="nav-text">Viewer Common Applib</span>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/viewer/index/commons/applib/services/userprof/UserProfileUiService.html">UserProfileUiService</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<span class="nav-text">Persistence JPA Applib</span>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/persistence/index/jpa/applib/services/JpaSupportService.html">JpaSupportService</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<span class="nav-text">Persistence QueryDsl Applib</span>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/persistence/index/querydsl/applib/services/auto/AutoCompleteGeneratedQueryService.html">AutoCompleteGeneratedQueryService</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/persistence/index/querydsl/applib/services/repo/QueryDslRepository.html">QueryDslRepository</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/persistence/index/querydsl/applib/services/support/DetachedQueryFactory.html">DetachedQueryFactory</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/persistence/index/querydsl/applib/services/support/QueryDslSupport.html">QueryDslSupport</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../latest/applib-ant/about.html">Annotations</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/annotation/Action.html">@Action</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/annotation/ActionLayout.html">@ActionLayout</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/annotation/Collection.html">@Collection</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/annotation/CollectionLayout.html">@CollectionLayout</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/annotation/DomainObject.html">@DomainObject</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/annotation/DomainObjectLayout.html">@DomainObjectLayout</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/annotation/DomainService.html">@DomainService</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/annotation/DomainServiceLayout.html">@DomainServiceLayout</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/annotation/Parameter.html">@Parameter</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/annotation/ParameterLayout.html">@ParameterLayout</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/annotation/Property.html">@Property</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib/index/annotation/PropertyLayout.html">@PropertyLayout</a>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<span class="nav-text">Other Causeway Annotations</span>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib/index/annotation/HomePage.html">@HomePage</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib/index/annotation/Title.html">@Title</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib/index/annotation/MinLength.html">@MinLength</a>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">include/exclude</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../latest/applib/index/annotation/Domain_Include.html">@Domain.Include</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../latest/applib/index/annotation/Domain_Exclude.html">@Domain.Exclude</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../latest/applib/index/annotation/MemberSupport.html">@MemberSupport</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../latest/applib/index/annotation/ObjectSupport.html">@ObjectSupport</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../latest/applib/index/annotation/ObjectLifecycle.html">@ObjectLifecycle</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../latest/applib/index/annotation/Programmatic.html">@Programmatic</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">architecture</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../latest/applib/index/annotation/Module.html">@Module</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../latest/applib/index/annotation/InteractionScope.html">@InteractionScope</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">custom value type support</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../latest/applib/index/annotation/Value.html">@Value</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../latest/applib/index/annotation/ValueSemantics.html">@ValueSemantics</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<span class="nav-text">Java EE Annotations</span>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib-ant/Digits.html">@Digits</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib-ant/Nullable.html">@Nullable</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib-ant/Pattern.html">@Pattern</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<span class="nav-text">JAXB</span>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib-ant/XmlJavaTypeAdapter.html">@XmlJavaTypeAdapter</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib-ant/XmlRootElement.html">@XmlRootElement</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<span class="nav-text">JPA</span>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib-ant/Entity.html">@Entity</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib-ant/Table.html">@Table</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib-ant/Transient.html">@Transient</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib-ant/Column.html">@Column</a>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../latest/applib-methods/about.html">Methods</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib-methods/prefixes.html">Supporting Methods</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib-methods/ui-hints.html">UI Hint Methods</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/applib-methods/lifecycle.html">Lifecycle Methods</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../applib-classes/about.html">Classes</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../applib-classes/events.html">Events</a>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../applib-classes/non-persisted-objects.html">Non-persisted objects</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../ViewModel.html">ViewModel</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../applib-classes/layout.html">Layout</a>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../applib-classes/value-types.html">Value Types</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../value/Blob.html">Blob</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../value/Clob.html">Clob</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../value/Markup.html">Markup</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../value/LocalResourcePath.html">LocalResourcePath</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../value/Password.html">Password</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../applib-classes/utility.html">Utility Classes</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../util/Enums.html">Enums</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../util/ObjectContracts.html">ObjectContracts</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../util/Reasons.html">Reasons</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../util/ReasonBuffer.html">ReasonBuffer</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../util/ReasonBuffer2.html">ReasonBuffer2</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../util/TitleBuffer.html">TitleBuffer</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../applib-classes/mixees-and-mixins.html">Mixees and Mixins</a>
<ul class="nav-list">
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../mixins/layout/Object_downloadLayout.html">Object_downloadLayout</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib/index/mixins/metamodel/Object_downloadMetamodelXml.html">Object_downloadMetamodelXml</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../mixins/metamodel/Object_rebuildMetamodel.html">Object_rebuildMetamodel</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib/index/mixins/metamodel/Object_logicalTypeName.html">Object_logicalTypeName</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib/index/mixins/metamodel/Object_objectIdentifier.html">Object_objectIdentifier</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../viewer/index/wicket/applib/mixins/Object_clearHints.html">Object_clearHints</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../mixins/rest/Object_openRestApi.html">Object_openRestApi</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib/index/mixins/dto/Dto_downloadXml.html">Dto_downloadXml</a>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib/index/mixins/dto/Dto_downloadXsd.html">Dto_downloadXsd</a>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">Command Log</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../latest/extensions/index/commandlog/applib/contributions/Object_recentCommands.html">Object_recentCommands</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../latest/extensions/index/commandlog/applib/contributions/HasInteractionId_commandLogEntry.html">HasInteraction_commandLogEntry</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../latest/extensions/index/commandlog/applib/contributions/HasUsername_recentCommandsByUser.html">HasUsername_recentCommandsByUser</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="3">
<button class="nav-item-toggle"></button>
<span class="nav-text">Execution Log</span>
<ul class="nav-list">
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../latest/extensions/index/executionlog/applib/contributions/Object_recentExecutions.html">Object_recentExecutions</a>
</li>
<li class="nav-item" data-depth="4">
<a class="nav-link" href="../../../../latest/extensions/index/executionlog/applib/contributions/HasInteractionId_executionLogEntries.html">HasInteractionId_executionLogEntries</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="3">
<a class="nav-link" href="../../../../latest/applib/index/mixins/system/HasTarget_openTargetObject.html">HasTarget_openTargetObject</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../applib-classes/spec.html">Specification pattern</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../latest/config/about.html">Configuration</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.applib.html">Applib</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.core.config.html">Core Configuration</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.core.meta-model.html">Core MetaModel</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.core.meta-model.introspector.html">Core MetaModel Introspection</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.core.meta-model.validator.html">Core MetaModel Validator</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.core.runtime.html">Core Runtime</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.core.runtime-services.html">Core Runtime Services</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.persistence.schema.html">Core Persistence Schema</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.persistence.commons.html">Core Persistence Commons</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.prototyping.html">Prototyping</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.security.keycloak.html">Keycloak Security Implementation</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.security.spring.html">Spring Security Implementation</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.viewer.common.html">Common Config for Viewers</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.viewer.graphql.html">GraphQL API</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.viewer.restfulobjects.html">REST API (Restful Objects Viewer)</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.viewer.wicket.html">Wicket Viewer</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/eclipselink.html">Eclipselink Configuration</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.extensions.html">Extensions</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.value-types.html">Value types</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/causeway.testing.html">Testing</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/config/sections/Other.html">Other</a>
</li>
</ul>
</li>
<li class="nav-item" data-depth="1">
<button class="nav-item-toggle"></button>
<a class="nav-link" href="../../../../latest/schema/about.html">Schema</a>
<ul class="nav-list">
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/schema/mml.html">MetaModel</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/schema/cmd.html">Command</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/schema/ixn.html">Interaction</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/schema/chg.html">Changes</a>
</li>
<li class="nav-item" data-depth="2">
<a class="nav-link" href="../../../../latest/schema/common.html">Common</a>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</div>
<div class="nav-panel-explore" data-panel="explore">
<div class="context">
<span class="title">Reference Guide</span>
<span class="version">3.1.0</span>
</div>
<ul class="components">
<li class="component">
<span class="title"> </span>
<ul class="versions">
<li class="version">
<a href="../../../../../docs/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../docs/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../docs/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../docs/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../docs/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../docs/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../docs/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../docs/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../docs/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Committers' Guide</span>
<ul class="versions">
<li class="version">
<a href="../../../../../comguide/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../comguide/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../comguide/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../comguide/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../comguide/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../comguide/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../comguide/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../comguide/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../comguide/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Contributors' Guide</span>
<ul class="versions">
<li class="version">
<a href="../../../../../conguide/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../conguide/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../conguide/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../conguide/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../conguide/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../conguide/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../conguide/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../conguide/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../conguide/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Design Docs</span>
<ul class="versions">
<li class="version">
<a href="../../../../../core/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../core/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../core/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../core/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../core/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../core/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../core/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../core/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../core/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Extensions</span>
<ul class="versions">
<li class="version">
<a href="../../../../../extensions/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../extensions/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../extensions/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../extensions/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../extensions/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../extensions/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../extensions/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../extensions/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../extensions/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">GraphQL Viewer</span>
<ul class="versions">
<li class="version">
<a href="../../../../../gqlv/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../gqlv/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../gqlv/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../gqlv/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../gqlv/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../gqlv/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../gqlv/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../gqlv/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../gqlv/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Incubator Catalog</span>
<ul class="versions">
<li class="version">
<a href="../../../../../incubator/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../incubator/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../incubator/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../incubator/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../incubator/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../incubator/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../incubator/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../incubator/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../incubator/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">JDO/DataNucleus</span>
<ul class="versions">
<li class="version">
<a href="../../../../../pjdo/latest/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../pjdo/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../pjdo/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../pjdo/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../pjdo/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../pjdo/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../pjdo/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">JPA</span>
<ul class="versions">
<li class="version">
<a href="../../../../../pjpa/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../pjpa/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../pjpa/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../pjpa/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../pjpa/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../pjpa/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../pjpa/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../pjpa/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../pjpa/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">QueryDSL</span>
<ul class="versions">
<li class="version">
<a href="../../../../../querydsl/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../querydsl/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../querydsl/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../querydsl/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../querydsl/3.2.0/about.html">3.2.0</a>
</li>
</ul>
</li>
<li class="component is-current">
<span class="title">Reference Guide</span>
<ul class="versions">
<li class="version">
<a href="../../../../latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../3.2.0/about.html">3.2.0</a>
</li>
<li class="version is-current">
<a href="../../../about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">regressiontests</span>
<ul class="versions">
<li class="version">
<a href="../../../../../regressiontests/latest/index.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../regressiontests/3.5.0/index.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../regressiontests/3.4.0/index.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../regressiontests/3.3.0/index.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../regressiontests/3.2.0/index.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../regressiontests/3.1.0/index.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../regressiontests/3.0.0/index.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../regressiontests/2.1.0/index.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../regressiontests/2.0.0/index.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Release Notes</span>
<ul class="versions">
<li class="version">
<a href="../../../../../relnotes/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../relnotes/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../relnotes/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../relnotes/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../relnotes/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../relnotes/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../relnotes/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../relnotes/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../relnotes/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">REST API (Restful Objects Viewer)</span>
<ul class="versions">
<li class="version">
<a href="../../../../../vro/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../vro/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../vro/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../vro/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../vro/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../vro/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../vro/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../vro/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../vro/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Security Guide</span>
<ul class="versions">
<li class="version">
<a href="../../../../../security/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../security/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../security/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../security/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../security/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../security/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../security/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../security/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../security/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Setup Guide</span>
<ul class="versions">
<li class="version">
<a href="../../../../../setupguide/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../setupguide/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../setupguide/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../setupguide/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../setupguide/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../setupguide/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../setupguide/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../setupguide/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../setupguide/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Testing Guide</span>
<ul class="versions">
<li class="version">
<a href="../../../../../testing/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../testing/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../testing/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../testing/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../testing/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../testing/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../testing/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../testing/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../testing/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Tutorials</span>
<ul class="versions">
<li class="version">
<a href="../../../../../tutorials/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../tutorials/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../tutorials/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../tutorials/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../tutorials/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../tutorials/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../tutorials/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../tutorials/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../tutorials/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">User Guide</span>
<ul class="versions">
<li class="version">
<a href="../../../../../userguide/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../userguide/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../userguide/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../userguide/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../userguide/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../userguide/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../userguide/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../userguide/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../userguide/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Value Types Catalog</span>
<ul class="versions">
<li class="version">
<a href="../../../../../valuetypes/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../valuetypes/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../valuetypes/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../valuetypes/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../valuetypes/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../valuetypes/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../valuetypes/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../valuetypes/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../valuetypes/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
<li class="component">
<span class="title">Web UI (Wicket Viewer)</span>
<ul class="versions">
<li class="version">
<a href="../../../../../vw/latest/about.html">4.0.0-M1</a>
</li>
<li class="version">
<a href="../../../../../vw/3.5.0/about.html">3.5.0</a>
</li>
<li class="version">
<a href="../../../../../vw/3.4.0/about.html">3.4.0</a>
</li>
<li class="version">
<a href="../../../../../vw/3.3.0/about.html">3.3.0</a>
</li>
<li class="version">
<a href="../../../../../vw/3.2.0/about.html">3.2.0</a>
</li>
<li class="version">
<a href="../../../../../vw/3.1.0/about.html">3.1.0</a>
</li>
<li class="version">
<a href="../../../../../vw/3.0.0/about.html">3.0.0</a>
</li>
<li class="version">
<a href="../../../../../vw/2.1.0/about.html">2.1.0</a>
</li>
<li class="version">
<a href="../../../../../vw/2.0.0/about.html">2.0.0</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
</aside>
</div>
<main role="main">
<div class="toolbar" role="navigation">
<button class="nav-toggle"></button>
<a href="../../../../../docs/latest/about.html" class="home-link"></a>
<nav class="breadcrumbs" aria-label="breadcrumbs">
<ul>
<li><a href="../../../about.html">Reference Guide</a></li>
<li><a href="DomainObject.html">@DomainObject</a></li>
</ul>
</nav>
<div class="page-versions">
<button class="version-menu-toggle" title="Show other versions of page">3.1.0</button>
<div class="version-menu">
<a class="version" href="../../../../latest/applib/index/annotation/DomainObject.html">4.0.0-M1</a>
<a class="version" href="../../../../3.5.0/applib/index/annotation/DomainObject.html">3.5.0</a>
<a class="version" href="../../../../3.4.0/applib/index/annotation/DomainObject.html">3.4.0</a>
<a class="version" href="../../../../3.3.0/applib/index/annotation/DomainObject.html">3.3.0</a>
<a class="version" href="../../../../3.2.0/applib/index/annotation/DomainObject.html">3.2.0</a>
<a class="version is-current" href="DomainObject.html">3.1.0</a>
<a class="version" href="../../../../3.0.0/applib/index/annotation/DomainObject.html">3.0.0</a>
<a class="version" href="../../../../2.1.0/applib/index/annotation/DomainObject.html">2.1.0</a>
<a class="version" href="../../../../2.0.0/applib/index/annotation/DomainObject.html">2.0.0</a>
</div>
</div>
<div class="edit-this-page"><a href="https://github.com/apache/causeway/edit/3.1.0/antora/components/refguide-index/modules/applib/pages/index/annotation/DomainObject.adoc">Edit</a></div>
</div>
<article class="doc">
<a name="section-top"></a>
<h1 class="page">@DomainObject</h1>
<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p>Domain semantics for domain objects (entities and view models; for services see <a href="../../../../latest/applib/index/annotation/DomainService.html" class="xref page">DomainService</a> ).</p>
</div>
<div class="paragraph">
<p>If - for the currently logged on user - none of the domain object&#8217;s members are effectively visible, (or if there are no members to begin with), the object instance is considered hidden. Hence a NOT-AUTHORIZED page will be displayed instead.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="api"><a class="anchor" href="#api"></a>API</h2>
<div class="sectionbody">
<div class="listingblock">
<div class="title">DomainObject.java</div>
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@interface DomainObject {
String[] aliased() default {}; <i class="conum" data-value="1"></i><b>(1)</b>
Class&lt;?&gt; autoCompleteRepository() default Object.class; <i class="conum" data-value="2"></i><b>(2)</b>
String autoCompleteMethod() default "autoComplete"; <i class="conum" data-value="3"></i><b>(3)</b>
Bounding bounding() default Bounding.NOT_SPECIFIED; <i class="conum" data-value="4"></i><b>(4)</b>
Editing editing() default Editing.NOT_SPECIFIED; <i class="conum" data-value="5"></i><b>(5)</b>
String editingDisabledReason() default ""; <i class="conum" data-value="6"></i><b>(6)</b>
Publishing entityChangePublishing() default Publishing.NOT_SPECIFIED; <i class="conum" data-value="7"></i><b>(7)</b>
Introspection introspection() default Introspection.NOT_SPECIFIED; <i class="conum" data-value="8"></i><b>(8)</b>
String mixinMethod() default "$$"; <i class="conum" data-value="9"></i><b>(9)</b>
Nature nature() default Nature.NOT_SPECIFIED; <i class="conum" data-value="10"></i><b>(10)</b>
Class&lt;? extends ObjectCreatedEvent&lt;?&gt;&gt; createdLifecycleEvent() default ObjectCreatedEvent.Default.class; <i class="conum" data-value="11"></i><b>(11)</b>
Class&lt;? extends ObjectPersistingEvent&lt;?&gt;&gt; persistingLifecycleEvent() default ObjectPersistingEvent.Default.class; <i class="conum" data-value="12"></i><b>(12)</b>
Class&lt;? extends ObjectPersistedEvent&lt;?&gt;&gt; persistedLifecycleEvent() default ObjectPersistedEvent.Default.class; <i class="conum" data-value="13"></i><b>(13)</b>
Class&lt;? extends ObjectLoadedEvent&lt;?&gt;&gt; loadedLifecycleEvent() default ObjectLoadedEvent.Default.class; <i class="conum" data-value="14"></i><b>(14)</b>
Class&lt;? extends ObjectUpdatingEvent&lt;?&gt;&gt; updatingLifecycleEvent() default ObjectUpdatingEvent.Default.class; <i class="conum" data-value="15"></i><b>(15)</b>
Class&lt;? extends ObjectUpdatedEvent&lt;?&gt;&gt; updatedLifecycleEvent() default ObjectUpdatedEvent.Default.class; <i class="conum" data-value="16"></i><b>(16)</b>
Class&lt;? extends ObjectRemovingEvent&lt;?&gt;&gt; removingLifecycleEvent() default ObjectRemovingEvent.Default.class; <i class="conum" data-value="17"></i><b>(17)</b>
Class&lt;? extends ActionDomainEvent&lt;?&gt;&gt; actionDomainEvent() default ActionDomainEvent.Default.class; <i class="conum" data-value="18"></i><b>(18)</b>
Class&lt;? extends PropertyDomainEvent&lt;?, ?&gt;&gt; propertyDomainEvent() default PropertyDomainEvent.Default.class; <i class="conum" data-value="19"></i><b>(19)</b>
Class&lt;? extends CollectionDomainEvent&lt;?, ?&gt;&gt; collectionDomainEvent() default CollectionDomainEvent.Default.class; <i class="conum" data-value="20"></i><b>(20)</b>
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td><a href="#aliased">aliased</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>Alternative logical type name(s) for the annotated type.</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td><a href="#autoCompleteRepository">autoCompleteRepository</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>The class of the domain service that provides an <code>autoComplete(String)</code> method.</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="3"></i><b>3</b></td>
<td><a href="#autoCompleteMethod">autoCompleteMethod</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>The method to use in order to perform the auto-complete search (defaults to "autoComplete").</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="4"></i><b>4</b></td>
<td><a href="#bounding">bounding</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>Indicates that the class has a bounded, or finite, set of instances.</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="5"></i><b>5</b></td>
<td><a href="#editing">editing</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>Whether the properties of this domain object can be edited, or collections of this object be added to/removed from.</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="6"></i><b>6</b></td>
<td><a href="#editingDisabledReason">editingDisabledReason</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>If <em>#editing()</em> is set to <em>Editing#DISABLED</em> , then the reason to provide to the user as to why the object&#8217;s properties cannot be edited/collections modified.</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="7"></i><b>7</b></td>
<td><a href="#entityChangePublishing">entityChangePublishing</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>Whether entity changes (persistent property updates) should be published to <em>org.apache.causeway.applib.services.publishing.spi.EntityPropertyChangeSubscriber</em> s and whether entity changes, captured as <em>org.apache.causeway.applib.services.publishing.spi.EntityChanges</em> , should be published to <em>org.apache.causeway.applib.services.publishing.spi.EntityChangesSubscriber</em> s.</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="8"></i><b>8</b></td>
<td><a href="#introspection">introspection</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>Controls on a per class basis, how meta-model class introspection should process members, supporting methods and callback methods.</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="9"></i><b>9</b></td>
<td><a href="#mixinMethod">mixinMethod</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>Applicable only if <em>#nature()</em> is <em>Nature#MIXIN</em> , indicates the name of the method within the mixin class to be inferred as the action of that mixin.</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="10"></i><b>10</b></td>
<td><a href="#nature">nature</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>The nature of this domain object.</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="11"></i><b>11</b></td>
<td><a href="#createdLifecycleEvent">createdLifecycleEvent</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>Indicates that the loading of the domain object should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using a custom (subclass of) <a href="../../../../latest/applib/index/events/lifecycle/ObjectCreatedEvent.html" class="xref page">ObjectCreatedEvent</a> .</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="12"></i><b>12</b></td>
<td><a href="#persistingLifecycleEvent">persistingLifecycleEvent</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>Indicates that the loading of the domain object should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using a custom (subclass of) <a href="../../../../latest/applib/index/events/lifecycle/ObjectPersistingEvent.html" class="xref page">ObjectPersistingEvent</a> .</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="13"></i><b>13</b></td>
<td><a href="#persistedLifecycleEvent">persistedLifecycleEvent</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>Indicates that the loading of the domain object should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using a custom (subclass of) <a href="../../../../latest/applib/index/events/lifecycle/ObjectPersistedEvent.html" class="xref page">ObjectPersistedEvent</a> .</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="14"></i><b>14</b></td>
<td><a href="#loadedLifecycleEvent">loadedLifecycleEvent</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>Indicates that the loading of the domain object should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using a custom (subclass of) <a href="../../../../latest/applib/index/events/lifecycle/ObjectLoadedEvent.html" class="xref page">ObjectLoadedEvent</a> .</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="15"></i><b>15</b></td>
<td><a href="#updatingLifecycleEvent">updatingLifecycleEvent</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>Indicates that the loading of the domain object should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using a custom (subclass of) <a href="../../../../latest/applib/index/events/lifecycle/ObjectUpdatingEvent.html" class="xref page">ObjectUpdatingEvent</a> .</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="16"></i><b>16</b></td>
<td><a href="#updatedLifecycleEvent">updatedLifecycleEvent</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>Indicates that the loading of the domain object should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using a custom (subclass of) <a href="../../../../latest/applib/index/events/lifecycle/ObjectUpdatedEvent.html" class="xref page">ObjectUpdatedEvent</a> .</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="17"></i><b>17</b></td>
<td><a href="#removingLifecycleEvent">removingLifecycleEvent</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>Indicates that the loading of the domain object should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using a custom (subclass of) <a href="../../../../latest/applib/index/events/lifecycle/ObjectRemovingEvent.html" class="xref page">ObjectRemovingEvent</a> .</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="18"></i><b>18</b></td>
<td><a href="#actionDomainEvent">actionDomainEvent</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>Indicates that an invocation of <em>any</em> action of the domain object (that do not themselves specify their own <code>@Action(domainEvent=&#8230;&#8203;)</code> should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using the specified custom (subclass of) <a href="../../../../latest/applib/index/events/domain/ActionDomainEvent.html" class="xref page">ActionDomainEvent</a> .</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="19"></i><b>19</b></td>
<td><a href="#propertyDomainEvent">propertyDomainEvent</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>Indicates that changes to <em>any</em> property of the domain object (that do not themselves specify their own <code>@Property(domainEvent=&#8230;&#8203;)</code> should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using the specified custom (subclass of) <a href="../../../../latest/applib/index/events/domain/PropertyDomainEvent.html" class="xref page">PropertyDomainEvent</a> .</p>
</div>
</div>
</div></td>
</tr>
<tr>
<td><i class="conum" data-value="20"></i><b>20</b></td>
<td><a href="#collectionDomainEvent">collectionDomainEvent</a>
<div class="openblock">
<div class="content">
<div class="paragraph">
<p>Indicates that changes to <em>any</em> collection of the domain object (that do not themselves specify their own <code>@Collection(domainEvent=&#8230;&#8203;)</code> should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using a custom (subclass of) <a href="../../../../latest/applib/index/events/domain/CollectionDomainEvent.html" class="xref page">CollectionDomainEvent</a> .</p>
</div>
</div>
</div></td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="members"><a class="anchor" href="#members"></a>Members</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="aliased"><a class="anchor" href="#aliased"></a>aliased</h3>
<div class="paragraph">
<p>Alternative logical type name(s) for the annotated type.</p>
</div>
</div>
<div class="sect2">
<h3 id="autoCompleteRepository"><a class="anchor" href="#autoCompleteRepository"></a>autoCompleteRepository</h3>
<div class="paragraph">
<p>The class of the domain service that provides an <code>autoComplete(String)</code> method.</p>
</div>
<div class="paragraph">
<p>It is sufficient to specify an interface rather than a concrete type.</p>
</div>
</div>
<div class="sect2">
<h3 id="autoCompleteMethod"><a class="anchor" href="#autoCompleteMethod"></a>autoCompleteMethod</h3>
<div class="paragraph">
<p>The method to use in order to perform the auto-complete search (defaults to "autoComplete").</p>
</div>
<div class="paragraph">
<p>The method is required to accept a single string parameter, and must return a list of the domain type.</p>
</div>
</div>
<div class="sect2">
<h3 id="bounding"><a class="anchor" href="#bounding"></a>bounding</h3>
<div class="paragraph">
<p>Indicates that the class has a bounded, or finite, set of instances.</p>
</div>
<div class="paragraph">
<p>Takes precedence over auto-complete.</p>
</div>
<div class="paragraph">
<p>Note: this replaces bounded=true|false prior to v2.x</p>
</div>
</div>
<div class="sect2">
<h3 id="editing"><a class="anchor" href="#editing"></a>editing</h3>
<div class="paragraph">
<p>Whether the properties of this domain object can be edited, or collections of this object be added to/removed from.</p>
</div>
<div class="paragraph">
<p>Note that non-editable objects can nevertheless have actions invoked upon them.</p>
</div>
</div>
<div class="sect2">
<h3 id="editingDisabledReason"><a class="anchor" href="#editingDisabledReason"></a>editingDisabledReason</h3>
<div class="paragraph">
<p>If <em>#editing()</em> is set to <em>Editing#DISABLED</em> , then the reason to provide to the user as to why the object&#8217;s properties cannot be edited/collections modified.</p>
</div>
<div class="paragraph">
<p>If left empty (default), no reason is given.</p>
</div>
</div>
<div class="sect2">
<h3 id="entityChangePublishing"><a class="anchor" href="#entityChangePublishing"></a>entityChangePublishing</h3>
<div class="paragraph">
<p>Whether entity changes (persistent property updates) should be published to <em>org.apache.causeway.applib.services.publishing.spi.EntityPropertyChangeSubscriber</em> s and whether entity changes, captured as <em>org.apache.causeway.applib.services.publishing.spi.EntityChanges</em> , should be published to <em>org.apache.causeway.applib.services.publishing.spi.EntityChangesSubscriber</em> s.</p>
</div>
</div>
<div class="sect2">
<h3 id="introspection"><a class="anchor" href="#introspection"></a>introspection</h3>
<div class="paragraph">
<p>Controls on a per class basis, how meta-model class introspection should process members, supporting methods and callback methods.</p>
</div>
</div>
<div class="sect2">
<h3 id="mixinMethod"><a class="anchor" href="#mixinMethod"></a>mixinMethod</h3>
<div class="paragraph">
<p>Applicable only if <em>#nature()</em> is <em>Nature#MIXIN</em> , indicates the name of the method within the mixin class to be inferred as the action of that mixin.</p>
</div>
<div class="paragraph">
<p>Supporting methods are then derived from that method name. For example, if the mixin method name is "act", then the <em>disable</em> supporting method will be "disableAct".</p>
</div>
<div class="paragraph">
<p>Typical examples are "act", "prop", "coll", "exec", "execute", "invoke", "apply" and so on. The default name is <code>$$</code>.</p>
</div>
<div class="literalblock">
<div class="content">
<pre>*NOTE* : it's more typical to instead use xref:refguide:applib:index/annotation/Action.adoc[Action] , xref:refguide:applib:index/annotation/Property.adoc[Property] or xref:refguide:applib:index/annotation/Collection.adoc[Collection] as the class-level annotation, indicating that the domain object is a mixin. The mixin method name for these is, respectively, "act", "prop" and "coll".</pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="nature"><a class="anchor" href="#nature"></a>nature</h3>
<div class="paragraph">
<p>The nature of this domain object.</p>
</div>
<div class="paragraph">
<p>Most common are natures of <em>Nature#ENTITY</em> and <em>Nature#VIEW_MODEL</em> . For mixins, rather than use a nature of <em>Nature#MIXIN</em> , it&#8217;s more typical to instead use <a href="../../../../latest/applib/index/annotation/Action.html" class="xref page">Action</a> , <a href="../../../../latest/applib/index/annotation/Property.html" class="xref page">Property</a> or <a href="../../../../latest/applib/index/annotation/Collection.html" class="xref page">Collection</a> as the class-level annotation, indicating that the domain object is a mixin. The <em>#mixinMethod() mixin method name</em> for these is, respectively, "act", "prop" and "coll".</p>
</div>
<div class="paragraph">
<p>The <em>Nature#BEAN</em> nature is for internally use, and should not normally be specified explicitly.</p>
</div>
</div>
<div class="sect2">
<h3 id="createdLifecycleEvent"><a class="anchor" href="#createdLifecycleEvent"></a>createdLifecycleEvent</h3>
<div class="paragraph">
<p>Indicates that the loading of the domain object should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using a custom (subclass of) <a href="../../../../latest/applib/index/events/lifecycle/ObjectCreatedEvent.html" class="xref page">ObjectCreatedEvent</a> .</p>
</div>
<div class="paragraph">
<p>This subclass must provide a no-arg constructor; the fields are set reflectively.</p>
</div>
</div>
<div class="sect2">
<h3 id="persistingLifecycleEvent"><a class="anchor" href="#persistingLifecycleEvent"></a>persistingLifecycleEvent</h3>
<div class="paragraph">
<p>Indicates that the loading of the domain object should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using a custom (subclass of) <a href="../../../../latest/applib/index/events/lifecycle/ObjectPersistingEvent.html" class="xref page">ObjectPersistingEvent</a> .</p>
</div>
<div class="paragraph">
<p>This subclass must provide a no-arg constructor; the fields are set reflectively.</p>
</div>
</div>
<div class="sect2">
<h3 id="persistedLifecycleEvent"><a class="anchor" href="#persistedLifecycleEvent"></a>persistedLifecycleEvent</h3>
<div class="paragraph">
<p>Indicates that the loading of the domain object should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using a custom (subclass of) <a href="../../../../latest/applib/index/events/lifecycle/ObjectPersistedEvent.html" class="xref page">ObjectPersistedEvent</a> .</p>
</div>
<div class="paragraph">
<p>This subclass must provide a no-arg constructor; the fields are set reflectively.</p>
</div>
</div>
<div class="sect2">
<h3 id="loadedLifecycleEvent"><a class="anchor" href="#loadedLifecycleEvent"></a>loadedLifecycleEvent</h3>
<div class="paragraph">
<p>Indicates that the loading of the domain object should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using a custom (subclass of) <a href="../../../../latest/applib/index/events/lifecycle/ObjectLoadedEvent.html" class="xref page">ObjectLoadedEvent</a> .</p>
</div>
<div class="paragraph">
<p>This subclass must provide a no-arg constructor; the fields are set reflectively.</p>
</div>
</div>
<div class="sect2">
<h3 id="updatingLifecycleEvent"><a class="anchor" href="#updatingLifecycleEvent"></a>updatingLifecycleEvent</h3>
<div class="paragraph">
<p>Indicates that the loading of the domain object should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using a custom (subclass of) <a href="../../../../latest/applib/index/events/lifecycle/ObjectUpdatingEvent.html" class="xref page">ObjectUpdatingEvent</a> .</p>
</div>
<div class="paragraph">
<p>This subclass must provide a no-arg constructor; the fields are set reflectively.</p>
</div>
</div>
<div class="sect2">
<h3 id="updatedLifecycleEvent"><a class="anchor" href="#updatedLifecycleEvent"></a>updatedLifecycleEvent</h3>
<div class="paragraph">
<p>Indicates that the loading of the domain object should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using a custom (subclass of) <a href="../../../../latest/applib/index/events/lifecycle/ObjectUpdatedEvent.html" class="xref page">ObjectUpdatedEvent</a> .</p>
</div>
<div class="paragraph">
<p>This subclass must provide a no-arg constructor; the fields are set reflectively.</p>
</div>
</div>
<div class="sect2">
<h3 id="removingLifecycleEvent"><a class="anchor" href="#removingLifecycleEvent"></a>removingLifecycleEvent</h3>
<div class="paragraph">
<p>Indicates that the loading of the domain object should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using a custom (subclass of) <a href="../../../../latest/applib/index/events/lifecycle/ObjectRemovingEvent.html" class="xref page">ObjectRemovingEvent</a> .</p>
</div>
<div class="paragraph">
<p>This subclass must provide a no-arg constructor; the fields are set reflectively.</p>
</div>
</div>
<div class="sect2">
<h3 id="actionDomainEvent"><a class="anchor" href="#actionDomainEvent"></a>actionDomainEvent</h3>
<div class="paragraph">
<p>Indicates that an invocation of <em>any</em> action of the domain object (that do not themselves specify their own <code>@Action(domainEvent=&#8230;&#8203;)</code> should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using the specified custom (subclass of) <a href="../../../../latest/applib/index/events/domain/ActionDomainEvent.html" class="xref page">ActionDomainEvent</a> .</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>@DomainObject(actionDomainEvent=SomeObject.GenericActionDomainEvent.class)
public class SomeObject{
public static class GenericActionDomainEvent extends ActionDomainEvent&lt;Object&gt; { ... }
public void changeStartDate(final Date startDate) { ...}
...
}</pre>
</div>
</div>
<div class="paragraph">
<p>This will result in all actions as a more specific type to use) to emit this event.</p>
</div>
<div class="paragraph">
<p>This subclass must provide a no-arg constructor; the fields are set reflectively. It must also use <code>Object</code> as its generic type. This is to allow mixins to also emit the same event.</p>
</div>
</div>
<div class="sect2">
<h3 id="propertyDomainEvent"><a class="anchor" href="#propertyDomainEvent"></a>propertyDomainEvent</h3>
<div class="paragraph">
<p>Indicates that changes to <em>any</em> property of the domain object (that do not themselves specify their own <code>@Property(domainEvent=&#8230;&#8203;)</code> should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using the specified custom (subclass of) <a href="../../../../latest/applib/index/events/domain/PropertyDomainEvent.html" class="xref page">PropertyDomainEvent</a> .</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>@DomainObject(propertyDomainEvent=SomeObject.GenericPropertyDomainEvent.class)
public class SomeObject{
public LocalDate getStartDate() { ...}
}</pre>
</div>
</div>
<div class="paragraph">
<p>This subclass must provide a no-arg constructor; the fields are set reflectively. It must also use <code>Object</code> as its generic type. This is to allow mixins to also emit the same event.</p>
</div>
</div>
<div class="sect2">
<h3 id="collectionDomainEvent"><a class="anchor" href="#collectionDomainEvent"></a>collectionDomainEvent</h3>
<div class="paragraph">
<p>Indicates that changes to <em>any</em> collection of the domain object (that do not themselves specify their own <code>@Collection(domainEvent=&#8230;&#8203;)</code> should be posted to the <em>org.apache.causeway.applib.services.eventbus.EventBusService event bus</em> using a custom (subclass of) <a href="../../../../latest/applib/index/events/domain/CollectionDomainEvent.html" class="xref page">CollectionDomainEvent</a> .</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre>@DomainObject(collectionDomainEvent=Order.GenericCollectionDomainEvent.class)
public class Order {
public SortedSet&lt;OrderLine&gt; getLineItems() { ...}
}</pre>
</div>
</div>
<div class="paragraph">
<p>This subclass must provide a no-arg constructor; the fields are set reflectively. It must also use <code>Object</code> as its generic type. This is to allow mixins to also emit the same event.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="example"><a class="anchor" href="#example"></a>Example</h2>
<div class="sectionbody">
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObject(
auditing=Auditing.ENABLED,
autoCompleteRepository=CustomerRepository.class
editing=Editing.ENABLED,
updatedLifecycleEvent=Customer.UpdatedEvent.class
)
public class Customer {
...
}</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="view-models"><a class="anchor" href="#view-models"></a>View Models</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The <code>@DomainObject(nature=VIEW_MODEL)</code> annotation, applied to a class, indicates that the class is a view model.</p>
</div>
<div class="paragraph">
<p>View models are not persisted to the database, instead their state is encoded within their identity (ultimately represented in the URL).</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObject(nature=VIEW_MODEL)
public class CustomerViewModel {
public CustomerViewModel() {}
public CustomerViewModel(String firstName, int lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
...
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Although there are several ways to instantiate a <a href="../../../../../userguide/latest/view-models.html" class="xref page">view model</a>, we recommend that they are instantiated using an N-arg constructor that initializes all relevant state.
The <a href="../../../../latest/applib/index/services/registry/ServiceRegistry.html" class="xref page">ServiceRegistry</a> can then be used to inject dependencies into the view model.
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">Customer cust = ...
CustomerViewModel vm = factoryService.viewModel(
new CustomerViewModel(cust.getFirstName(), cust.getLastName()));</code></pre>
</div>
</div>
<div class="paragraph">
<p>The view model&#8217;s memento will be derived from the value of the view model object&#8217;s properties.
Any properties annotated with <a href="../../../../latest/applib/index/annotation/Programmatic.html" class="xref page">@Programmatic</a> will be excluded from the memento.
Properties that are merely <a href="../../../../latest/applib/index/annotation/Property.html#hidden" class="xref page">hidden</a> <em>are</em> included in the memento.</p>
</div>
<div class="paragraph">
<p>View models when defined using <code>@DomainObject(nature=VIEW_MODEL)</code> have some limitations:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>view models cannot hold collections other view models (simple properties <em>are</em> supported, though)</p>
</li>
<li>
<p>collections (of either view models or entities) are ignored.</p>
</li>
<li>
<p>not every data type is supported,</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>However, these limitations do <em>not</em> apply to <a href="../../../../../userguide/latest/view-models.html#jaxb" class="xref page">JAXB</a> view models.
If you are using view models heavily, you may wish to restrict yourself to just the JAXB flavour.</p>
</div>
<div class="sect2">
<h3 id="object-aliases"><a class="anchor" href="#object-aliases"></a>Object aliases</h3>
<div class="paragraph">
<p>The <a href="../../../../latest/applib/index/annotation/DomainObject.html#logicalTypeName" class="xref page">logicalTypeName()</a> element is used to provide a unique alias for the object&#8217;s class name.</p>
</div>
<div class="paragraph">
<p>This value is used internally to generate a string representation of an objects identity (the <code>Oid</code>).
This can appear in several contexts, including:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>as the value of <code>Bookmark#getObjectType()</code> and in the <code>toString()</code> value of <code>Bookmark</code>
(see <a href="../../../../latest/applib/index/services/bookmark/BookmarkService.html" class="xref page">BookmarkService</a>)</p>
</li>
<li>
<p>in the serialization of <code>OidDto</code> in the <a href="../../../../latest/schema/cmd.html" class="xref page">command</a> and <a href="../../../../latest/schema/ixn.html" class="xref page">interaction</a> schemas</p>
</li>
<li>
<p>in the URLs of the <a href="../../../../../vro/latest/about.html" class="xref page">RestfulObjects viewer</a></p>
</li>
<li>
<p>in the URLs of the <a href="../../../../../vw/latest/about.html" class="xref page">Web UI (Wicket viewer)</a></p>
</li>
<li>
<p>in XML snapshots generated by the <a href="../../../../latest/applib/index/services/xmlsnapshot/XmlSnapshotService.html" class="xref page">XmlSnapshotService</a></p>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="examples"><a class="anchor" href="#examples"></a>Examples</h2>
<div class="sectionbody">
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@Named("orders.Order")
@DomainObject
public class Order {
...
}</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="precedence"><a class="anchor" href="#precedence"></a>Precedence</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The rules of precedence are:</p>
</div>
<div class="olist arabic">
<ol class="arabic">
<li>
<p><code>@DomainObject#logicalTypeName</code></p>
</li>
<li>
<p>ORM-specific:</p>
<div class="olist loweralpha">
<ol class="loweralpha" type="a">
<li>
<p>JDO: <a href="#refguide:applib-ant:PersistenceCapable.adoc" class="xref unresolved">@PersistenceCapable</a>, if at least the <code>schema</code> attribute is defined.</p>
<div class="paragraph">
<p>If both <code>schema</code> and <code>table</code> are defined, then the value is &#8220;schema.table&#8221;.
If only <code>schema</code> is defined, then the value is &#8220;schema.className&#8221;.</p>
</div>
</li>
<li>
<p>(JPA) <code>@Table#schema()</code>.</p>
</li>
</ol>
</div>
</li>
<li>
<p>Fully qualified class name of the entity.</p>
</li>
</ol>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="Tip"></i>
</td>
<td class="content">
<div class="paragraph">
<p>This might be obvious, but to make explicit: we recommend that you always specify an object type for your domain objects.</p>
</div>
<div class="paragraph">
<p>Otherwise, if you refactor your code (change class name or move package), then any externally held references to the OID of the object will break.
At best this will require a data migration in the database; at worst it could cause external clients, eg if accessing data through the <a href="../../../../../vro/latest/about.html" class="xref page">Restful Objects</a> viewer, to break.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>If the object type is not unique across all domain classes then the framework will fail-fast and fail to boot.
An error message will be printed in the log to help you determine which classes have duplicate object tyoes.</p>
</div>
<div class="sect2">
<h3 id="nature-2"><a class="anchor" href="#nature-2"></a>Nature</h3>
<div class="paragraph">
<p>The <a href="../../../../latest/applib/index/annotation/DomainObject.html#nature" class="xref page">nature()</a> element is used to characterize the domain object as either an entity (part of the domain layer) or as a view model (part of the application layer).
If the domain object should be thought of as an entity, it also captures how the persistence of that entity is managed.</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObject(nature=Nature.VIEW_MODEL)
public class PieChartAnalysis {
...
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Specifically, the nature must be one of:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>NOT_SPECIFIED,</code></p>
<div class="paragraph">
<p>(the default); specifies no paricular semantics for the domain class.</p>
</div>
</li>
<li>
<p><code>ENTITY</code></p>
<div class="paragraph">
<p>indicates that the domain object is an entity whose persistence is managed internally by Apache Causeway, using the JDO/DataNucleus objectstore.</p>
</div>
</li>
<li>
<p><code>MIXIN</code></p>
<div class="paragraph">
<p>indicates that the domain object is part of the domain layer, and is contributing behaviour to objects of some other type as a mixin (also known as a trait).</p>
</div>
<div class="paragraph">
<p>For further discussion on using mixins, see <a href="../../../../../userguide/latest/overview.html" class="xref page">mixins</a> in the user guide.</p>
</div>
</li>
<li>
<p><code>VIEW_MODEL</code></p>
<div class="paragraph">
<p>indicates that the domain object is conceptually part of the application layer, and exists to surfaces behaviour and/or state that is aggregate of one or more domain entities.</p>
</div>
<div class="ulist">
<ul>
<li>
<p><em>Variant: External Entity</em></p>
<div class="paragraph">
<p>Or indicates that the domain object is a wrapper/proxy/stub (choose your term) to an entity that is managed by some related external system.
For example, the domain object may hold just the URI to a RESTful resource of some third party REST service, or the id of some system accessible over SOAP.</p>
</div>
<div class="paragraph">
<p>The identity of an external entity is determined solely by the state of entity&#8217;s properties.
The framework will automatically recreate the domain object each time it is interacted with.</p>
</div>
</li>
<li>
<p><em>Variant: In-Memory Entity</em></p>
<div class="paragraph">
<p>Or indicates that the domain object is a wrapper/proxy/stub to a "synthetic" entity, for example one that is constructed from some sort of internal memory data structure.</p>
</div>
<div class="paragraph">
<p>The identity of an in-memory entity is determined solely by the state of entity&#8217;s properties.
The framework will automatically recreate the domain object each time it is interacted with.</p>
</div>
</li>
</ul>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>Those natures that indicate the domain object is an entity (of some sort or another) mean then that the domain object is considered to be part of the domain model layer.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="paragraph">
<p>For <code>VIEW_MODEL</code> domain objects the state of the object is encoded into its internal OID (represented ultimately as its URL), and is recreated directly from that URL.</p>
</div>
<div class="paragraph">
<p>Because this particular implementation was originally added to Apache Causeway in support of view models, the term was also used for the logically different external entities and in-memory entities.</p>
</div>
<div class="paragraph">
<p>The benefit of <code>nature()</code> is that it allows the developer to properly characterize the layer (domain vs application) that an entity lives, thus avoiding confusion as "view model" (the implementation technique) and "view model" (the application layer concept).</p>
</div>
</td>
</tr>
</table>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="paragraph">
<p>On the other hand, view models defined in this way do have some limitations; see <a href="../../../../latest/applib/index/annotation/DomainObject.html#view-models" class="xref page">View Models</a> for further discussion.</p>
</div>
<div class="paragraph">
<p>These limitations do <em>not</em> apply to <a href="../../../../../userguide/latest/view-models.html#jaxb" class="xref page">JAXB</a> view models.
If you are using view models heavily, you may wish to restrict yourself to just the JAXB flavour.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="editing-2"><a class="anchor" href="#editing-2"></a>Editing</h3>
<div class="paragraph">
<p>The <a href="../../../../latest/applib/index/annotation/DomainObject.html#editing" class="xref page">editing()</a> element determines whether a domain object&#8217;s properties and collections are not editable (are read-only).</p>
</div>
<div class="paragraph">
<p>The default is <code>AS_CONFIGURED</code>, meaning that the <a href="../../../../latest/config/sections/causeway.applib.html#causeway.applib.annotation.domain-object.editing" class="xref page">causeway.applib.annotation.domain-object.editing</a>
configuration property is used to determine the whether the object is modifiable:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>true</code></p>
<div class="paragraph">
<p>the object&#8217;s properties and collections are modifiable.</p>
</div>
</li>
<li>
<p><code>false</code></p>
<div class="paragraph">
<p>the object&#8217;s properties and collections are read-only, ie <em>not</em> modifiable.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>If there is no configuration property in <code>application.properties</code> then object are assumed to be modifiable.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="Tip"></i>
</td>
<td class="content">
<div class="paragraph">
<p>In other words, editing can be disabled globally by setting the <a href="../../../../latest/config/sections/causeway.applib.html#causeway.applib.annotation.domain-object.editing" class="xref page">causeway.applib.adoc#causeway.applib.annotation.domain-object.editing</a> configuration property:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-ini hljs" data-lang="ini">causeway.applib.annotation.domain-object.editing=false</code></pre>
</div>
</div>
<div class="paragraph">
<p>We recommend this setting; it will help drive out the underlying business operations (processes and procedures) that require objects to change; these can then be captured as business actions.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>This default can be overridden on an object-by-object basis; if <code>editing()</code> is set to <code>ENABLED</code> then the object&#8217;s properties and collections are editable irrespective of the configured value; if set to <code>DISABLED</code> then the object&#8217;s properties and collections are not editable irrespective of the configured value.</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObject(
editing=Editing.DISABLED,
editingDisabledReason="Reference data, so cannot be modified"
)
public class Country {
...
}</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="domain-event-defaults"><a class="anchor" href="#domain-event-defaults"></a>Domain Event Defaults</h3>
<div class="paragraph">
<p>Whenever an member of a domain object is interacted with then a domain event will be fired, for each of the various phases (hidden, disabled, validated, executing, executed).</p>
</div>
<div class="paragraph">
<p>For each of the three types of members (action, property and collection), the <a href="../../../../latest/applib/index/annotation/DomainObject.html" class="xref page">DomainObject</a> provides an element that defines a common event domain class to be fired whenever interacting with members of that type.
This default event type can be overridden with a more specific event type if necessary.</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<colgroup>
<col style="width: 18.75%;">
<col style="width: 37.5%;">
<col style="width: 43.75%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Type</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>@DomainObject default</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Overridden with</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Actions</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/applib/index/annotation/DomainObject.html#actionDomainEvent" class="xref page">actionDomainEvent()</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/applib/index/annotation/Action.html#domainEvent" class="xref page">@Action#domainEvent</a>.</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Properties</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/applib/index/annotation/DomainObject.html#propertyDomainEvent" class="xref page">propertyDomainEvent()</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/applib/index/annotation/Property.html#domainEvent" class="xref page">@Property#domainEvent()</a>.</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Collections</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/applib/index/annotation/DomainObject.html#collectionDomainEvent" class="xref page">collectionDomainEvent()</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/applib/index/annotation/Collection.html#domainEvent" class="xref page">@Collection#domainEvent()</a>.</p>
</div></div></td>
</tr>
</tbody>
</table>
<div class="sect3">
<h4 id="action-example"><a class="anchor" href="#action-example"></a>Action example</h4>
<div class="paragraph">
<p>For an action:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObject(
actionDomainEvent=ToDoItem.ActionDomainEventDefault.class
)
public class ToDoItem {
public static class ActionDomainEventDefault extends
org.apache.causeway.applib.events.domain.ActionDomainEvent&lt;Object&gt; { }
// ...
public void updateDescription(final String description) {
this.description = description;
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>The specified class will also be used as the event for any mixin action contributed to the class.</p>
</div>
<div class="paragraph">
<p>Note though one small difference between the events emitted by a "regular" action and a contributed action is that the source of the event (as in <code>event#getSource()</code> will be different.
In the former case it will be the domain object instance, in the latter it will be the mixin object instantiated automatically by the framework.</p>
</div>
<div class="paragraph">
<p>However, the domain object is available using <code>event#getMixedIn()</code>.
Even easier, <code>event#getSubject()</code> will always return the domain object (it returns the <code>#getMixedIn()</code> if present, otherwise the <code>#getSource()</code>.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="paragraph">
<p>Action domain events have generic types, with the (first and only) generic type indicating the event&#8217;s source&#8217;s type.</p>
</div>
<div class="paragraph">
<p>Because an event specified at the class level might have either the domain object or a mixin for the domain object as its source, they should therefore use simply <code>Object</code> as their generic type.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
<div class="sect3">
<h4 id="property-example"><a class="anchor" href="#property-example"></a>Property example</h4>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObject(
propertyDomainEvent=ToDoItem.PropertyDomainEventDefault.class
)
public class ToDoItem {
public static class PropertyDomainEventDefault
extends org.apache.causeway.applib.events.domain.PropertyDomainEvent&lt;Object&gt; { }
...
@Getter @Setter
private String description;
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>If there is a mixin for the domain object, then this will also honour the domain event.
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@Property(
propertyDomainEvent=ToDoItem_priority.PropertyDomainEventDefault.class
)
public class ToDoItem_priority {
private final ToDoItem todoItem;
// constructor omitted
public static class PropertyDomainEventDefault
extends org.apache.causeway.applib.events.domain.PropertyDomainEvent&lt;Object&gt; { }
public Integer prop() { /* ... */ }
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Interactions with the property contributed by this mixin will emit the domain event of the subject (<code>ToDoItem</code>).</p>
</div>
<div class="paragraph">
<p>One small difference between the events emitted by a "regular" property and a contributed property is that the source of the event (as in <code>event#getSource()</code> will be different.
In the former case it will be the domain object instance, in the latter it will be the mixin object instantiated automatically by the framework.</p>
</div>
<div class="paragraph">
<p>However, the domain object is available using <code>event#getMixedIn()</code>.
Even easier, <code>event#getSubject()</code> will always return the domain object (it returns the <code>#getMixedIn()</code> if present, otherwise the <code>#getSource()</code>.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="paragraph">
<p>Property domain events have generic types, with the first generic type indicating the event&#8217;s source&#8217;s type, and the second generic type indicating the property return type.</p>
</div>
<div class="paragraph">
<p>Because an event specified at the class level might have either the domain object or a mixin for the domain object as its source, they should therefore use simply <code>Object</code> as their first generic type.</p>
</div>
<div class="paragraph">
<p>They should <em>also</em> have <code>Object</code> for their second generic type, because the return type of the various properties of the domain object will or could be different.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
<div class="sect3">
<h4 id="collection-example"><a class="anchor" href="#collection-example"></a>Collection example</h4>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">import lombok.Getter;
import lombok.Setter;
@DomainObject(
collectionDomainEvent=ToDoItem.CollectionDomainEventDefault.class
)
public class ToDoItem {
public static class CollectionDomainEventDefault extends
org.apache.causeway.applib.events.domain.CollectionDomainEvent&lt;Object&gt; { }
...
@Getter @Setter
private Set&lt;Category&gt; categories = new TreeSet&lt;&gt;();
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>If there is a mixin for the domain object, then this will also honour the domain event.
For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">public class ToDoItem {
@Collection
@CollectionLayout(defaultView = "table")
public class related {
public List&lt;ToDoItem&gt; coll() {
// ...
}
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Interactions with the collection contributed by this mixin will emit the domain event of the subject (<code>ToDoItem</code>).</p>
</div>
<div class="paragraph">
<p>One small difference between the events emitted by a "regular" collection and a contributed action is that the source of the event (as in <code>event#getSource()</code> will be different.
In the former case it will be the domain object instance, in the latter it will be the mixin object instantiated automatically by the framework.</p>
</div>
<div class="paragraph">
<p>However, the domain object is available using <code>event#getMixedIn()</code>.
Even easier, <code>event#getSubject()</code> will always return the domain object (it returns the <code>#getMixedIn()</code> if present, otherwise the <code>#getSource()</code>.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="paragraph">
<p>Collection domain events have generic types, with the first generic type indicating the event&#8217;s source&#8217;s type, and the second generic type indicating the element type.</p>
</div>
<div class="paragraph">
<p>Because an event specified at the class level might have either the domain object or a mixin for the domain object as its source, they should therefore use simply <code>Object</code> as their first generic type.</p>
</div>
<div class="paragraph">
<p>They should <em>also</em> have <code>Object</code> for their second generic type, because the element type of the various collections of the domain object will or could be different.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect2">
<h3 id="lifecycle-events"><a class="anchor" href="#lifecycle-events"></a>Lifecycle Events</h3>
<div class="paragraph">
<p>Whenever the framework interacts with a domain entity, lifecycle events are fired.
These are:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>instantiated</p>
<div class="paragraph">
<p>through <a href="../../../../latest/applib/index/services/factory/FactoryService.html" class="xref page">FactoryService</a>.
An event is also fired for view models</p>
</div>
</li>
<li>
<p>persisting</p>
<div class="paragraph">
<p>an entity is about to be persisted (<code>INSERT</code>ed) into the database</p>
</div>
</li>
<li>
<p>persisted</p>
<div class="paragraph">
<p>an entity has just been persisted to the database</p>
</div>
</li>
<li>
<p>loaded</p>
<div class="paragraph">
<p>an already persistent entity has just been loaded from the database</p>
</div>
</li>
<li>
<p>updating</p>
<div class="paragraph">
<p>an already persistent entity is about to be saved (<code>UPDATE</code>d) to the database</p>
</div>
</li>
<li>
<p>updated</p>
<div class="paragraph">
<p>an already persistent entity has just been saved (<code>UPDATE</code>d) to the database</p>
</div>
</li>
<li>
<p>removing</p>
<div class="paragraph">
<p>an already persistent entity is about to be removed (<code>DELETE</code>d) from the database</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>The framework has a built-in event class (for each lifecycle hint) that is raised by default; for example a <code>ObjectUpdatingEvent.Default</code> is raised when an object is about to be updated.
Subscribers subscribe through the <a href="../../../../latest/applib/index/services/eventbus/EventBusService.html" class="xref page">EventBusService</a> and can use the event to obtain a reference to the object just created.</p>
</div>
<div class="paragraph">
<p>This basic model can be influenced in a couple of ways:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>first, it is also possible to suppress any events from being emitted using a configuration property (a different config property exists each lifecycle hook).</p>
</li>
<li>
<p>second, an element on <a href="../../../../latest/applib/index/annotation/DomainObject.html" class="xref page">DomainObject</a> annotation (for each lifecycle hook) allows a different event subtype to be emitted instead</p>
<div class="paragraph">
<p>This allows subscribers to more targeted as to the events that they subscribe to.</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>The framework also provides convenience "Doop" and a "Noop" event classes, that provoke these behaviours:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>if the appropriate <a href="../../../../latest/applib/index/annotation/DomainObject.html" class="xref page">DomainObject</a>' element is set to the "Doop" subclass, then this will event will be fired</p>
<div class="paragraph">
<p>this is a convenient way of ensuring an event is fired even if the hook has been disabled globally, but without the hassle of defining a custom event type</p>
</div>
</li>
<li>
<p>if set to the "Noop" subclass, then an event will <em>not</em> be fired.</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The table below summarises all the lifecycle hooks:</p>
</div>
<table class="tableblock frame-all grid-all stretch">
<caption class="title">Table 1. Lifecycle events</caption>
<colgroup>
<col style="width: 13.3333%;">
<col style="width: 40%;">
<col style="width: 20%;">
<col style="width: 26.6667%;">
</colgroup>
<tbody>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Lifecycle event</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Config property</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/applib/index/annotation/DomainObject.html" class="xref page">@DomainObject</a> override</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>Framework event types</p>
</div></div></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>created</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/config/sections/causeway.applib.html#causeway.applib.annotation.domain-object.created-lifecycle-event.post-for-default" class="xref page">causeway.applib.annotation.domain-object.created-lifecycle-event.post-for-default</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/applib/index/annotation/DomainObject.html#createdLifecycleEvent" class="xref page">createdLifecycleEvent()</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ObjectCreatedEvent.Default<br>
ObjectCreatedEvent.Doop<br>
ObjectCreatedEvent.Noop</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>loaded</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/config/sections/causeway.applib.html#causeway.applib.annotation.domain-object.loaded-lifecycle-event.post-for-default" class="xref page">causeway.applib.annotation.domain-object.loaded-lifecycle-event.post-for-default</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/applib/index/annotation/DomainObject.html#loadedLifecycleEvent" class="xref page">loadedLifecycleEvent()</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ObjectLoadedEvent.Default<br>
ObjectLoadedEvent.Doop<br>
ObjectLoadedEvent.Noop</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>persisting</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/config/sections/causeway.applib.html#causeway.applib.annotation.domain-object.persisting-lifecycle-event.post-for-default" class="xref page">causeway.applib.annotation.domain-object.persisting-lifecycle-event.post-for-default</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/applib/index/annotation/DomainObject.html#persistingLifecycleEvent" class="xref page">persistingLifecycleEvent()</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ObjectPersistingEvent.Default<br>
ObjectPersistingEvent.Doop<br>
ObjectPersistingEvent.Noop</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>persisted</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/config/sections/causeway.applib.html#causeway.applib.annotation.domain-object.persisted-lifecycle-event.post-for-default" class="xref page">causeway.applib.annotation.domain-object.persisted-lifecycle-event.post-for-default</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/applib/index/annotation/DomainObject.html#persistedLifecycleEvent" class="xref page">persistedLifecycleEvent()</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ObjectPersistedEvent.Default<br>
ObjectPersistedEvent.Doop<br>
ObjectPersistedEvent.Noop</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>updating</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/config/sections/causeway.applib.html#causeway.applib.annotation.domain-object.updating-lifecycle-event.post-for-default" class="xref page">causeway.applib.annotation.domain-object.updating-lifecycle-event.post-for-default</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/applib/index/annotation/DomainObject.html#updatingLifecycleEvent" class="xref page">updatingLifecycleEvent()</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ObjectUpdatingEvent.Default<br>
ObjectUpdatingEvent.Doop<br>
ObjectUpdatingEvent.Noop</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>updated</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/config/sections/causeway.applib.html#causeway.applib.annotation.domain-object.updated-lifecycle-event.post-for-default" class="xref page">causeway.applib.annotation.domain-object.updated-lifecycle-event.post-for-default</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/applib/index/annotation/DomainObject.html#updatedLifecycleEvent" class="xref page">updatedLifecycleEvent()</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ObjectUpdatedEvent.Default<br>
ObjectUpdatedEvent.Doop<br>
ObjectUpdatedEvent.Noop</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p>removing</p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/config/sections/causeway.applib.html#causeway.applib.annotation.domain-object.removing-lifecycle-event.post-for-default" class="xref page">causeway.applib.annotation.domain-object.removing-lifecycle-event.post-for-default</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a href="../../../../latest/applib/index/annotation/DomainObject.html#removingLifecycleEvent" class="xref page">removingLifecycleEvent()</a></p>
</div></div></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ObjectRemovingEvent.Default<br>
ObjectRemovingEvent.Doop<br>
ObjectRemovingEvent.Noop</code></p></td>
</tr>
</tbody>
</table>
<div class="sect3">
<h4 id="subscribers"><a class="anchor" href="#subscribers"></a>Subscribers</h4>
<div class="paragraph">
<p>Subscribers can be either coarse-grained (if they subscribe to the top-level event type):</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
@Service
public class SomeSubscriber {
@EventListener(ObjectCreatedEvent.class)
public void on(ObjectCreatedEvent ev) {
if(ev.getSource() instanceof ToDoItem) {
...
}
}
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>or can be fine-grained (by subscribing to specific event subtypes):</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Service;
@Service
public class SomeSubscriber {
@EventListener(ToDoItem.ObjectCreatedEvent.class)
public void on(ToDoItem.ObjectCreatedEvent ev) {
...
}
}</code></pre>
</div>
</div>
</div>
<div class="sect3">
<h4 id="examples-2"><a class="anchor" href="#examples-2"></a>Examples</h4>
<div class="sect4">
<h5 id="created-example"><a class="anchor" href="#created-example"></a>created example</h5>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObjectLayout(
createdLifecycleEvent=ToDoItem.CreatedEvent.class
)
public class ToDoItem {
public static class CreatedEvent
extends org.apache.causeway.applib.events.lifecycle.ObjectCreatedEvent&lt;ToDoItem&gt; { }
...
}</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="paragraph">
<p>It&#8217;s possible to instantiate objects without firing this lifecycle; just instantiate using its regular constructor, and then use the <code>ServiceInjector</code>'s
<a href="../../../../latest/applib/index/services/inject/ServiceInjector.html" class="xref page">injectServicesInto(&#8230;&#8203;)</a> to manually inject any required domain services.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
<div class="sect4">
<h5 id="persisting-example"><a class="anchor" href="#persisting-example"></a>persisting example</h5>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObjectLayout(
persistingLifecycleEvent=ToDoItem.PersistingEvent.class
)
public class ToDoItem {
public static class PersistingEvent extends
org.apache.causeway.applib.events.lifecycle.ObjectPersistingEvent&lt;ToDoItem&gt; { }
// ...
}</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="persisted-example"><a class="anchor" href="#persisted-example"></a>persisted example</h5>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObjectLayout(
persistedLifecycleEvent=ToDoItem.PersistedEvent.class
)
public class ToDoItem {
public static class PersistedEvent extends
org.apache.causeway.applib.events.lifecycle.ObjectPersistedEvent&lt;ToDoItem&gt; { }
// ...
}</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="loaded-example"><a class="anchor" href="#loaded-example"></a>loaded example</h5>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObjectLayout(
loadedLifecycleEvent=ToDoItem.LoadedEvent.class
)
public class ToDoItem {
public static class LoadedEvent extends
org.apache.causeway.applib.events.lifecycle.ObjectLoadedEvent&lt;ToDoItem&gt; { }
...
}</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="updating-example"><a class="anchor" href="#updating-example"></a>updating example</h5>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObjectLayout(
updatingLifecycleEvent=ToDoItem.UpdatingEvent.class
)
public class ToDoItem {
public static class UpdatingEvent extends
org.apache.causeway.applib.events.lifecycle.ObjectUpdatingEvent&lt;ToDoItem&gt; { }
// ...
}</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="updated-example"><a class="anchor" href="#updated-example"></a>updated example</h5>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObjectLayout(
updatedLifecycleEvent=ToDoItem.UpdatedEvent.class
)
public class ToDoItem {
public static class UpdatedEvent extends
org.apache.causeway.applib.events.lifecycle.ObjectUpdatedEvent&lt;ToDoItem&gt; { }
// ...
}</code></pre>
</div>
</div>
</div>
<div class="sect4">
<h5 id="removing-example"><a class="anchor" href="#removing-example"></a>removing example</h5>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObjectLayout(
removingLifecycleEvent=ToDoItem.RemovingEvent.class
)
public class ToDoItem {
public static class RemovingEvent extends
org.apache.causeway.applib.events.lifecycle.ObjectRemovingEvent&lt;ToDoItem&gt; { }
// ...
}</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect2">
<h3 id="auditing"><a class="anchor" href="#auditing"></a>Auditing</h3>
<div class="paragraph">
<p>The <a href="../../../../latest/applib/index/annotation/DomainObject.html#entityChangePublishing" class="xref page">entityChangePublishing()</a> element indicates that if the object is modified, then each of its changed properties should be submitted to the registered <a href="../../../../latest/applib/index/services/publishing/spi/EntityPropertyChangeSubscriber.html" class="xref page">EntityPropertyChangeSubscriber</a>(s).</p>
</div>
<div class="paragraph">
<p>The default value for the element is <code>AS_CONFIGURED</code>, meaning that the <a href="../../../../latest/config/sections/causeway.applib.html#causeway.applib.annotation.domain-object.entity-change-publishing" class="xref page">causeway.applib.annotation.domain-object.entity-change-publishing</a> configuration property is used to determine the whether the action is audited:</p>
</div>
<div class="ulist">
<ul>
<li>
<p><code>all</code><br></p>
<div class="paragraph">
<p>all changed properties of objects are audited</p>
</div>
</li>
<li>
<p><code>none</code><br></p>
<div class="paragraph">
<p>no changed properties of objects are audited</p>
</div>
</li>
</ul>
</div>
<div class="paragraph">
<p>If there is no configuration property in <code>application.properties</code> then auditing is automatically enabled for domain objects.</p>
</div>
<div class="paragraph">
<p>This default can be overridden on an object-by-object basis; if <code>entityChangePublishing()</code> is set to <code>ENABLED</code> then changed properties of instances of the domain class are audited irrespective of the configured value; if set to <code>DISABLED</code> then the changed properties of instances are <em>not</em> audited, again irrespective of the configured value.</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObject(
entityChangePublishing=Publishing.ENABLED <i class="conum" data-value="1"></i><b>(1)</b>
)
public class Customer {
...
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>because set to enabled, will be audited irrespective of the configured value.</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="reference-data"><a class="anchor" href="#reference-data"></a>Reference Data</h3>
<div class="paragraph">
<p>Some domain classes are immutable to the user, and moreover have only a fixed number of instances.
Often these are "reference" ("standing") data, or lookup data/pick lists.
Typical examples could include categories, countries, states, and tax or interest rate tables.</p>
</div>
<div class="paragraph">
<p>Where the number of instances is relatively small, ie bounded, then the <a href="../../../../latest/applib/index/annotation/DomainObject.html#bounding" class="xref page">bounding()</a> element can be used as a hint.
For such domain objects the framework will automatically allow instances to be selected; <a href="../../../../../vw/latest/about.html" class="xref page">Web UI (Wicket viewer)</a> displays these as a drop-down list.</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObject(
bounding=Bounding.BOUNDED,
editing=Editing.DISABLED <i class="conum" data-value="1"></i><b>(1)</b>
)
public class Currency {
...
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>This attribute is commonly combined with <code>editing=DISABLED</code> to enforce the fact that reference data is immutable</td>
</tr>
</table>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="Tip"></i>
</td>
<td class="content">
<div class="paragraph">
<p>There is nothing to prevent you from using this attribute for regular mutable entities, and indeed this is sometimes worth doing during early prototyping.
However, if there is no realistic upper bound to the number of instances of an entity that might be created, generally you should use <a href="../../../../latest/applib-methods/prefixes.html#autoComplete" class="xref page">autoComplete&#8230;&#8203;()</a> supporting method or the <a href="../../../../latest/applib/index/annotation/DomainObject.html#autoCompleteRepository" class="xref page">@DomainObject#autoCompleteRepository</a> attribute instead.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="auto-complete"><a class="anchor" href="#auto-complete"></a>Auto-complete</h3>
<div class="paragraph">
<p>The <a href="../../../../latest/applib/index/annotation/DomainObject.html#autoCompleteRepository" class="xref page">autoCompleteRepository()</a> element nominates a single method on a domain service as the fallback means for looking up instances of the domain object using a simple string.</p>
</div>
<div class="paragraph">
<p>For example, this might search for a customer by their name or number.
Or it could search for a country based on its ISO-3 code or user-friendly name.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="Tip"></i>
</td>
<td class="content">
<div class="paragraph">
<p>If you require additional control - for example restricting the returned results based on the object being interacted with - then use the <a href="../../../../latest/applib-methods/prefixes.html#autoComplete" class="xref page">autoComplete&#8230;&#8203;()</a> supporting method instead.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObject(
autoCompleteRepository=CustomerRepository.class
)
public class Customer {
....
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>where:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainService
public class CustomerRepository {
List&lt;Customer&gt; autoComplete(String search); <i class="conum" data-value="1"></i><b>(1)</b>
...
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>is assumed to be called "autoComplete", and accepts a single string</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>(As noted above) the method invoked on the repository is assumed to be called "autoComplete".
The optional <a href="../../../../latest/applib/index/annotation/DomainObject.html#autoCompleteMethod" class="xref page">autoCompleteMethod()</a> element allows the name of this method to be overridden.</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObject(
autoCompleteRepository=Customers.class,
autoCompleteAction="findByName"
)
public class Customer {
....
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>where in this case <code>findByName</code> might be an existing action already defined:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainService
public class Customers {
@Action(semantics=SemanticsOf.SAFE)
public List&lt;Customer&gt; findByName(
@MinLength(3) <i class="conum" data-value="1"></i><b>(1)</b>
@ParameterLayout(named="name")
String name);
...
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>end-user must enter minimum number of characters to trigger the query</td>
</tr>
</table>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
The autocomplete "action" can also be a regular method, annotated using <a href="../../../../latest/applib/index/annotation/Programmatic.html" class="xref page">@Programmatic</a>.
That is, it does not need to be part of the metamodel:
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>+</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainService
public class Customers {
@Programmatic
public List&lt;Customer&gt; findByName(
@MinLength(3)
String name);
...
}</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="mixin-method"><a class="anchor" href="#mixin-method"></a>Mixin method</h3>
<div class="paragraph">
<p>The <a href="../../../../latest/applib/index/annotation/DomainObject.html#mixinMethod" class="xref page">mixinMethod()</a> element specifies the name of the method to be treated as a "reserved" method name, meaning that the mixin&#8217;s name should instead be inferred from the mixin&#8217;s type.</p>
</div>
<div class="paragraph">
<p>For example:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">@DomainObject
public class Customer {
@DomainObject(
nature=Nature.MIXIN, <i class="conum" data-value="1"></i><b>(1)</b>
mixinMethod="execute" <i class="conum" data-value="2"></i><b>(2)</b>
)
public class placeOrder { <i class="conum" data-value="3"></i><b>(3)</b>
public Customer execute(Product p, int quantity) { <i class="conum" data-value="4"></i><b>(4)</b>
// ...
}
public String disableExecute() {
// ...
}
public String validate0Execute() {
// ...
}
}
)</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>This is a mixin.<br>
Alternatively, could have used <a href="../../../../latest/applib/index/annotation/Action.html" class="xref page">@Action</a>.</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>This mixin is using a non-standard method.</td>
</tr>
<tr>
<td><i class="conum" data-value="3"></i><b>3</b></td>
<td>a trick - this is not a <code>static</code> class, so the java compiler will create the 1-arg constructor automatically</td>
</tr>
<tr>
<td><i class="conum" data-value="4"></i><b>4</b></td>
<td>Same name as the specified mixinMethod.
Alternatively, when using <a href="../../../../latest/applib/index/annotation/Action.html" class="xref page">@Action</a> then method&#8217;s name defaults to <code>act</code>.</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>This allows all mixins to follow a similar convention, with the name of the mixin inferred entirely from its type ("placeOrder").</p>
</div>
<div class="paragraph">
<p>When invoked programmatically, the code reads:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">someCustomer.new placeOrder().execute(someProduct, 3);</code></pre>
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="see-also"><a class="anchor" href="#see-also"></a>See also</h2>
<div class="sectionbody">
<div class="ulist">
<ul>
<li>
<p><a href="../../../../latest/applib/index/services/publishing/spi/EntityPropertyChangeSubscriber.html" class="xref page">EntityPropertyChangeSubscriber</a> SPI</p>
<div class="paragraph">
<p>(only applies to entity objects)</p>
</div>
</li>
<li>
<p><a href="../../../../latest/applib/index/services/publishing/spi/EntityChangesSubscriber.html" class="xref page">EntityChangesSubscriber</a> SPI</p>
<div class="paragraph">
<p>(only applies to entity objects)</p>
</div>
</li>
</ul>
</div>
</div>
</div>
</article>
<aside class="article-aside toc hide-for-print" role="navigation">
<p class="toc-title">On this page</p>
<div id="article-toc"></div>
</aside>
</main>
</div>
<footer class="footer">
<div class="content">
<div class="copyright">
<p>
Copyright © 2010~2024 The Apache Software Foundation, licensed under the Apache License, v2.0.
<br/>
Apache, the Apache feather logo, Apache Causeway, and the Apache Causeway project logo are all trademarks of The Apache Software Foundation.
</p>
</div>
<div class="revision">
<p>Revision: build-website.20251118-0002</p>
</div>
</div>
</footer>
<script src="../../../../../_/js/site.js"></script>
<script async src="../../../../../_/js/vendor/highlight.js"></script>
<script src="../../../../../_/js/vendor/jquery-3.4.1.min.js"></script>
<script src="../../../../../_/js/vendor/jquery-ui-1.12.1.custom.widget-only.min.js"></script>
<script src="../../../../../_/js/vendor/jquery.tocify.min.js"></script>
<script>
$(function() {
$("#article-toc").tocify( {
showEffect: "slideDown",
hashGenerator: "pretty",
hideEffect: "slideUp",
selectors: "h2, h3",
scrollTo: 120,
smoothScroll: true,
theme: "jqueryui",
highlightOnScroll: true
} );
});
</script>
<script src="../../../../../_/js/vendor/docsearch.min.js"></script>
<script>
function focusSearchInput () { document.querySelector('#algolia-search-input').focus() }
var search = docsearch({
appId: '5ISP5TFAEN',
apiKey: '0fc51c28b4ad46e7318e96d4e97fab7c',
indexName: 'causeway-apache-org',
inputSelector: '#algolia-search-input',
autocompleteOptions: { hint: false, keyboardShortcuts: ['s'] },
debug: false,
}).autocomplete
search.on('autocomplete:closed', function () { search.autocomplete.setVal() })
focusSearchInput()
window.addEventListener('load', focusSearchInput);
</script>
<!--
docsearch options:
https://docsearch.algolia.com/docs/behavior/
-->
<!--
https://www.algolia.com/doc/api-reference/api-parameters/
algoliaOptions: { hitsPerPage: 6 },
-->
</body>
</html>