geronimo-scm mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Geronimo v2.2: Java Persistence API deployment plans (page edited)
Date Tue, 18 Nov 2008 02:35:00 GMT
<html>
<head>
    <base href="http://cwiki.apache.org/confluence" />
    <style type="text/css">
    <!--
    body, p, td, table, tr, .bodytext, .stepfield {
	font-family: Verdana, arial, sans-serif;
	font-size: 11px;
	line-height: 16px;
	color: #000000;
	font-weight: normal;
}
#PageContent {
	text-align: left;
	background-color: #fff;
	padding: 0px;
	margin: 0px;
    padding-bottom:20px;
}
/*
** when this stylesheet is used for the Tiny MCE Wysiwyg editor's edit area, we can't
** use an id=PageContent or class=wiki-content, so we must
** set the body style to that used for PageContent, and p to that used for wiki-content.
*/

body {
	margin: 0px;
	padding: 0px;
	text-align: center;
    background-color: #f0f0f0;
}

@media print {

body {
    background-color: #fff;
}

}

.monospaceInput {
    font:12px monospace
}

.wiki-content p, .commentblock p {
    margin: 16px 0px 16px 0px;
    padding: 0px;
}

.wiki-content-preview {
    padding: 5px;
    border-left: 1px solid #3c78b5;
    border-right: 1px solid #3c78b5;
}

ul, ol {
    margin-top: 2px;
    margin-bottom: 2px;
    padding-top: 0px;
    padding-bottom: 0px;
}

pre {
    padding: 0px;
    margin-top: 5px;
    margin-left: 15px;
    margin-bottom: 5px;
    margin-right: 5px;
    text-align: left;
}

.helpheading {
    font-weight: bold;
    background-color: #D0D9BD;
        border-bottom: 1px solid #3c78b5;
        padding: 4px 4px 4px 4px;
        margin: 0px;
        margin-top: 10px;
}
.helpcontent {
        padding: 4px 4px 20px 4px;
    background-color: #f5f7f1;
}

.code {
 	border: 1px dashed #3c78b5;
    font-size: 11px;
	font-family: Courier;
    margin: 10px;
	line-height: 13px;
}

.focusedComment {
    background: #ffffce;
}

.commentBox, .focusedComment {
    padding: 10px;
    margin: 5px 0 5px 0;
    border: 1px #bbb solid;
}

.codeHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.codeContent {
    text-align: left;
    background-color: #f0f0f0;
    padding: 3px;
}

.preformatted {
 	border: 1px dashed #3c78b5;
    font-size: 11px;
	font-family: Courier;
    margin: 10px;
	line-height: 13px;
}

.preformattedHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.preformattedContent {
    background-color: #f0f0f0;
    padding: 3px;
}

.panel {
 	border: 1px dashed #3c78b5;
    margin: 10px;
    margin-top: 0px;
}

.panelHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.panelContent {
    background-color: #f0f0f0;
    padding: 5px;
}

.anonymousAlert {
    background-color: #f0f0f0;
 	border: 1px dashed red;
    font-size: 11px;
    padding: 10px 5px 10px 5px;
    margin: 4px;
	line-height: 13px;
}

.lockAlert {
    background-color: #f0f0f0;
    width: 50%;
 	border: 1px dashed red;
    font-size: 11px;
    padding: 10px 5px 10px 5px;
    margin: 4px;
	line-height: 13px;
}


.code-keyword {
  color: #000091;
  background-color: inherit;
}

.code-object {
  color: #910091;
  background-color: inherit;
}

.code-quote {
  color: #009100;
  background-color: inherit;
}

.code-comment {
  color: #808080;
  background-color: inherit;
}


.code-xml .code-keyword {
  color: inherit;
  font-weight: bold;
}

.code-tag {
  color: #000091;
  background-color: inherit;
}

.breadcrumbs {
    background-color: #f0f0f0;
 	border-color: #3c78b5;
	border-width: 1px 0px 1px 0px;
	border-style: solid;
    font-size: 11px;
    padding: 3px 0px 3px 0px;
}

.navmenu {
    border: 1px solid #ccc;
}

.menuheading {
    font-weight: bold;
    background-color: #f0f0f0;
 	border-bottom: 1px solid #3c78b5;
	padding: 4px 4px 2px 4px;
}

.menuitems {
	padding: 4px 4px 20px 4px;
}

.rightpanel {
    border-left: 1px solid #ccc;
    border-bottom: 1px solid #ccc;
}

#helpheading {
    text-align: left;
    font-weight: bold;
    background-color: #D0D9BD;
 	border-bottom: 1px solid #3c78b5;
	padding: 4px 4px 4px 4px;
	margin: 0px;
}
#helpcontent {
	padding: 4px 4px 4px 4px;
    background-color: #f5f7f1;
}
.helptab-unselected {
    font-weight: bold;
	padding: 5px;
    background-color: #f5f7f1;
}
.helptab-selected {
    font-weight: bold;
    background-color: #D0D9BD;
	padding: 5px;
}
.helptabs {
    margin: 0px;
    background-color: #f5f7f1;
	padding: 5px;
}
.infopanel-heading {
    font-weight: bold;
	padding: 4px 0px 2px 0px;
}

.pagebody {
}

.pageheader {
	padding: 5px 5px 5px 0px;
 	border-bottom: 1px solid #3c78b5;
}

.pagetitle {
	font-size: 22px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
}

.newpagetitle {
    color: #ccc !important;
}

.steptitle {
	font-size: 18px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
	margin-bottom: 7px;
}

.substeptitle {
    font-size: 12px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
    margin: 2px 4px 4px 4px;
    padding: 2px 4px 1px 4px;
}

.stepdesc {
    font-family: Verdana, arial, sans-serif;
	font-size: 11px;
	line-height: 16px;
	font-weight: normal;
    color: #666666;
    margin-top: 7px;
    margin-bottom: 7px;
}

.steplabel {
    font-weight: bold;
    margin-right: 4px;
    color: black;
    float: left;
    width: 15%;
    text-align: right;
}

.stepfield {
    background: #f0f0f0;
    padding: 5px;
}

.submitButtons{
    margin-top:5px;
    text-align:right;
}

.formtitle {
	font-size: 12px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
}

.sectionbottom {
    border-bottom: 1px solid #3c78b5;
}

.topRow {
    border-top: 2px solid #3c78b5;
}

.tabletitle {
	font-size: 14px;
	font-weight: bold;
	font-family: Arial, sans-serif;
    padding: 3px 0px 2px 0px;
    margin: 8px 4px 2px 0px;
	color: #003366;
	border-bottom: 2px solid #3c78b5;
}
.pagesubheading {
    color: #666666;
    font-size: 10px;
    padding: 0px 0px 5px 0px;
}

HR {
	color: 3c78b5;
	height: 1;
}

A:link, A:visited, A:active, A:hover {
	color: #003366;
}

h1 A:link, h1 A:visited, h1 A:active {
	text-decoration: none;
}

h1 A:hover {
    border-bottom: 1px dotted #003366;
}

.wiki-content > :first-child, .commentblock > :first-child {
    margin-top: 3px;
}

.logocell {
    padding: 10px;
}

input {
	font-family: verdana, geneva, arial, sans-serif;
	font-size: 11px;
	color: #000000;
}

textarea, textarea.editor {
	font-family: verdana, geneva, arial, sans-serif;
	font-size: 11px;
	color: #333333;
}

/* use logoSpaceLink instead.
.spacenametitle {
	font: 21px/31px Impact, Arial, Helvetica;
    font-weight: 100;
    color: #999999;
	margin: 0px;
}
.spacenametitle img {
  margin: 0 0 -4px 0;
}
.spacenametitle a {
    text-decoration: none;
    color: #999999;
}
.spacenametitle a:visited {
    text-decoration: none;
    color: #999999;
}*/

.spacenametitle-printable {
	font: 20px/25px Impact, Arial, Helvetica;
    font-weight: 100;
    color: #999999;
	margin: 0px;
}
.spacenametitle-printable a {
    text-decoration: none;
    color: #999999;
}
.spacenametitle-printable a:visited {
    text-decoration: none;
    color: #999999;
}

.blogDate {
	font-weight: bold;
	text-decoration: none;
	color: black;
}

.blogSurtitle {
    background: #f0f0f0;
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.blogHeading {
    font-size: 20px;
    line-height: normal;
    font-weight: bold;
    padding: 0px;
    margin: 0px;
}

.blogHeading a {
   text-decoration: none;
   color: black;
}

.endsection {
	align: right;
	color: #666666;
	margin-top: 10px;
}
.endsectionleftnav {
	align: right;
	color: #666666;
	margin-top: 10px;
}

h1 {
	font-size: 24px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	color: #003366;
 	border-bottom: 1px solid #3c78b5;
	padding: 2px;
	margin: 36px 0px 4px 0px;
}

h2 {
	font-size: 18px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
 	border-bottom: 1px solid #3c78b5;
	padding: 2px;
	margin: 27px 0px 4px 0px;
}

h3 {
	font-size: 14px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 21px 0px 4px 0px;
}

h4 {
	font-size: 12px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 18px 0px 4px 0px;
}

h4.search {
	font-size: 12px;
	line-height: normal;
	font-weight: normal;
	background-color: #f0f0f0;
	padding: 4px;
	margin: 18px 0px 4px 0px;
}

h5 {
	font-size: 10px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 14px 0px 4px 0px;
}

h6 {
	font-size: 8px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 14px 0px 4px 0px;
}

.smallfont {
    font-size: 10px;
}
.descfont {
    font-size: 10px;
    color: #666666;
}
.smallerfont {
    font-size: 9px;
}
.smalltext {
    color: #666666;
    font-size: 10px;
}
.smalltext a {
    color: #666666;
}
.smalltext-blue {
    color: #3c78b5;
    font-size: 10px;
}
.surtitle {
    margin-left: 1px;
    margin-bottom: 5px;
    font-size: 14px;
    color: #666666;
}

/* css hack found here:  http://www.fo3nix.pwp.blueyonder.co.uk/tutorials/css/hacks/ */
.navItemOver { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #003366; cursor: hand; voice-family: '\'}\''; voice-family:inherit; cursor: pointer;}
.navItemOver a { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItemOver a:visited { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItemOver a:hover { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItem { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; }
.navItem a { color: #ffffff; text-decoration: none; }
.navItem a:hover { color: #ffffff; text-decoration: none; }
.navItem a:visited { color: #ffffff; text-decoration: none; }

div.padded { padding: 4px; }
div.thickPadded { padding: 10px; }
h3.macrolibrariestitle {
    margin: 0px 0px 0px 0px;
}

div.centered { text-align: center; margin: 10px; }
div.centered table {margin: 0px auto; text-align: left; }

.tableview table {
    margin: 0;
}

.tableview th {
    text-align: left;
    color: #003366;
    font-size: 12px;
    padding: 5px 0px 0px 5px;
    border-bottom: 2px solid #3c78b5;
}
.tableview td {
    text-align: left;
    border-color: #ccc;
    border-width: 0px 0px 1px 0px;
    border-style: solid;
    margin: 0;
    padding: 4px 10px 4px 5px;
}

.grid {
    margin: 2px 0px 5px 0px;
    border-collapse: collapse;
}
.grid th  {
    border: 1px solid #ccc;
    padding: 2px 4px 2px 4px;
    background: #f0f0f0;
    text-align: center;
}
.grid td  {
    border: 1px solid #ccc;
    padding: 3px 4px 3px 4px;
}
.gridHover {
	background-color: #f9f9f9;
}

td.infocell {
    background-color: #f0f0f0;
}
.label {
	font-weight: bold;
	color: #003366;
}

label {
	font-weight: bold;
	color: #003366;
}

.error {
	background-color: #fcc;
}

.errorBox {
	background-color: #fcc;
    border: 1px solid #c00;
    padding: 5px;
    margin: 5px;
}

.errorMessage {
	color: #c00;
}

.success {
	background-color: #dfd;
}

.successBox {
	background-color: #dfd;
    border: 1px solid #090;
    padding: 5px;
    margin-top:5px;
    margin-bottom:5px;
}

blockquote {
	padding-left: 10px;
	padding-right: 10px;
	margin-left: 5px;
	margin-right: 0px;
	border-left: 1px solid #3c78b5;
}

table.confluenceTable
{
    margin: 5px;
    border-collapse: collapse;
}

/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */
table.confluenceTable td.confluenceTd
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
}

/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */
table.confluenceTable th.confluenceTh
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
    background-color: #f0f0f0;
    text-align: center;
}

td.confluenceTd
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
}

th.confluenceTh
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
    background-color: #f0f0f0;
    text-align: center;
}

DIV.small {
	font-size: 9px;
}

H1.pagename {
	margin-top: 0px;
}

IMG.inline  {}

.loginform {
    margin: 5px;
    border: 1px solid #ccc;
}

/* The text how the "This is a preview" comment should be shown. */
.previewnote { text-align: center;
                font-size: 11px;
                    color: red; }

/* How the preview content should be shown */
.previewcontent { background: #E0E0E0; }

/* How the system messages should be shown (DisplayMessage.jsp) */
.messagecontent { background: #E0E0E0; }

/* How the "This page has been modified..." -comment should be shown. */
.conflictnote { }

.createlink {
    color: maroon;
}
a.createlink {
    color: maroon;
}
.templateparameter {
    font-size: 9px;
    color: darkblue;
}

.diffadded {
    background: #ddffdd;
    padding: 1px 1px 1px 4px;
	border-left: 4px solid darkgreen;
}
.diffdeleted {
    color: #999;
    background: #ffdddd;
    padding: 1px 1px 1px 4px;
	border-left: 4px solid darkred;
}
.diffnochange {
    padding: 1px 1px 1px 4px;
	border-left: 4px solid lightgrey;
}
.differror {
    background: brown;
}
.diff {
    font-family: lucida console, courier new, fixed-width;
	font-size: 12px;
	line-height: 14px;
}
.diffaddedchars {
    background-color:#99ff99;
    font-weight:bolder;
}
.diffremovedchars {
    background-color:#ff9999;
    text-decoration: line-through;
    font-weight:bolder;
}

.greybackground {
    background: #f0f0f0
}

.greybox {
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.borderedGreyBox {
    border: 1px solid #cccccc;
    background-color: #f0f0f0;
    padding: 10px;
}

.greyboxfilled {
 	border: 1px solid #ddd;
    background: #f0f0f0;
    padding: 3px;
	margin: 1px 1px 10px 1px;
}

.navBackgroundBox {
    padding: 5px 5px 5px 5px;
    font-size: 22px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: white;
    background: #3c78b5;
    text-decoration: none;
}

.previewBoxTop {
	background-color: #f0f0f0;
    border-width: 1px 1px 0px 1px;
    border-style: solid;
    border-color: #3c78b5;
    padding: 5px;
    margin: 5px 0px 0px 0px;
    text-align: center;
}
.previewContent {
    background-color: #fff;
 	border-color: #3c78b5;
	border-width: 0px 1px 0px 1px;
	border-style: solid;
	padding: 10px;
	margin: 0px;
}
.previewBoxBottom {
	background-color: #f0f0f0;
    border-width: 0px 1px 1px 1px;
    border-style: solid;
    border-color: #3c78b5;
    padding: 5px;
    margin: 0px 0px 5px 0px;
    text-align: center;
}

.functionbox {
    background-color: #f0f0f0;
 	border: 1px solid #3c78b5;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.functionbox-greyborder {
    background-color: #f0f0f0;
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.search-highlight {
    background-color: #ffffcc;
}

/* normal (white) background */
.rowNormal {
    background-color: #ffffff;
 }

/* alternate (pale yellow) background */
.rowAlternate {
    background-color: #f7f7f7;
}

/* used in the list attachments table */
.rowAlternateNoBottomColor {
    background-color: #f7f7f7;
}

.rowAlternateNoBottomNoColor {
}

.rowAlternateNoBottomColor td {
    border-bottom: 0px;
}

.rowAlternateNoBottomNoColor td {
    border-bottom: 0px;
}

/* row highlight (grey) background */
.rowHighlight {
    background-color: #f0f0f0;

}

TD.greenbar {FONT-SIZE: 2px; BACKGROUND: #00df00; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
TD.redbar {FONT-SIZE: 2px; BACKGROUND: #df0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
TD.darkredbar {FONT-SIZE: 2px; BACKGROUND: #af0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }

TR.testpassed {FONT-SIZE: 2px; BACKGROUND: #ddffdd; PADDING: 0px; }
TR.testfailed {FONT-SIZE: 2px; BACKGROUND: #ffdddd; PADDING: 0px; }

.toolbar  {
    margin: 0px;
    border-collapse: collapse;
}

.toolbar td  {
    border: 1px solid #ccc;
    padding: 2px 2px 2px 2px;
    color: #ccc;
}

td.noformatting {
    border-width: 0px;
    border-style: none;
    text-align: center;
	padding: 0px;
}

.commentblock {
    margin: 12px 0 12px 0;
}

/*
 * Divs displaying the license information, if necessary.
 */
.license-eval, .license-none, .license-nonprofit {
    border-top: 1px solid #bbbbbb;
    text-align: center;
    font-size: 10px;
    font-family: Verdana, Arial, Helvetica, sans-serif;
}

.license-eval, .license-none {
    background-color: #ffcccc;
}

.license-eval b, .license-none b {
    color: #990000
}

.license-nonprofit {
    background-color: #ffffff;
}

/*
 * The shadow at the bottom of the page between the main content and the
 * "powered by" section.
 */
.bottomshadow {
    height: 12px;
    background-image: url("$req.contextPath/images/border/border_bottom.gif");
    background-repeat: repeat-x;
}

/*
 * Styling of the operations box
 */
.navmenu .operations li, .navmenu .operations ul {
    list-style: none;
    margin-left: 0;
    padding-left: 0;
}

.navmenu .operations ul {
    margin-bottom: 9px;
}

.navmenu .label {
    font-weight: inherit;
}

/*
 * Styling of ops as a toolbar
 */
.toolbar div {
    display: none;
}

.toolbar .label {
    display: none;
}

.toolbar .operations {
    display: block;
}

.toolbar .operations ul {
    display: inline;
    list-style: none;
    margin-left: 10px;
    padding-left: 0;
}

.toolbar .operations li {
    list-style: none;
    display: inline;
}

/* list page navigational tabs */
#foldertab {
padding: 3px 0px 3px 8px;
margin-left: 0;
border-bottom: 1px solid #3c78b5;
font: bold 11px Verdana, sans-serif;
}

#foldertab li {
list-style: none;
margin: 0;
display: inline;
}

#foldertab li a {
padding: 3px 0.5em;
margin-left: 3px;
border: 1px solid #3c78b5;
border-bottom: none;
background: #3c78b5;
text-decoration: none;
}

#foldertab li a:link { color: #ffffff; }
#foldertab li a:visited { color: #ffffff; }

#foldertab li a:hover {
color: #ffffff;
background: #003366;
border-color: #003366;
}

#foldertab li a.current {
background: white;
border-bottom: 1px solid white;
color: black;
}

#foldertab li a.current:link { color: black; }
#foldertab li a.current:visited { color: black; }
#foldertab li a.current:hover {
background: white;
border-bottom: 1px solid white;
color: black;
}

/* alphabet list */
ul#squaretab {
margin-left: 0;
padding-left: 0;
white-space: nowrap;
font: bold 8px Verdana, sans-serif;
}

#squaretab li {
display: inline;
list-style-type: none;
}

#squaretab a {
padding: 2px 6px;
border: 1px solid #3c78b5;
}

#squaretab a:link, #squaretab a:visited {
color: #fff;
background-color: #3c78b5;
text-decoration: none;
}

#squaretab a:hover {
color: #ffffff;
background-color: #003366;
border-color: #003366;
text-decoration: none;
}

#squaretab li a#current {
background: white;
color: black;
}

.blogcalendar * {
    font-family:verdana, arial, sans-serif;
    font-size:x-small;
    font-weight:normal;
    line-height:140%;
    padding:2px;
}


table.blogcalendar {
    border: 1px solid #3c78b5;
}

.blogcalendar th.calendarhead, a.calendarhead {
    font-size:x-small;
    font-weight:bold;
    padding:2px;
    text-transform:uppercase;
    background-color: #3c78b5;
    color: #ffffff;
    letter-spacing: .3em;
    text-transform: uppercase;
}

.calendarhead:visited {color: white;}
.calendarhead:active {color: white;}
.calendarhead:hover {color: white;}

.blogcalendar th {
    font-size:x-small;
    font-weight:bold;
    padding:2px;
    background-color:#f0f0f0;
}

.blogcalendar td {
    font-size:x-small;
    font-weight:normal;
}

.searchGroup { padding: 0 0 10px 0; background: #f0f0f0; }
.searchGroupHeading { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; padding: 2px 4px 1px 4px; }
.searchItem { padding: 1px 4px 1px 4px; }
.searchItemSelected { padding: 1px 4px 1px 4px; font-weight: bold; background: #ddd; }

/* permissions page styles */
.permissionHeading {
    border-bottom: #bbb; border-width: 0 0 1px 0; border-style: solid; font-size: 16px; text-align: left;
}
.permissionTab {
    border-width: 0 0 0 1px; border-style: solid; background: #3c78b5; color: #ffffff; font-size: 10px;
}
.permissionSuperTab {
    border-width: 0 0 0 1px; border-style: solid; background: #003366; color: #ffffff;
}
.permissionCell {
    border-left: #bbb; border-width: 0 0 0 1px; border-style: solid;
}

/* warning panel */
.warningPanel { background: #FFFFCE; border:#F0C000 1px solid; padding: 8px; margin: 10px; }
/* alert panel */
.alertPanel { background: #FFCCCC; border:#C00 1px solid; padding: 8px; margin: 10px; }
/* info panel */
.infoPanel { background: #D8E4F1; border:#3c78b5 1px solid; padding: 8px; margin: 10px; }

/* side menu highlighting (e.g. space content screen) */
.optionPadded { padding: 2px; }
.optionSelected { background-color: #ffffcc; padding: 2px; border: 1px solid #ddd; margin: -1px; }
.optionSelected a { font-weight: bold; text-decoration: none; color: black; }

/* information macros */
.noteMacro { border-style: solid; border-width: 1px; border-color: #F0C000; background-color: #FFFFCE; text-align:left; margin-top: 5px; margin-bottom: 5px}
.warningMacro { border-style: solid; border-width: 1px; border-color: #c00; background-color: #fcc; text-align:left; margin-top: 5px; margin-bottom: 5px}
.infoMacro { border-style: solid; border-width: 1px; border-color: #3c78b5; background-color: #D8E4F1; text-align:left; margin-top: 5px; margin-bottom: 5px}
.tipMacro { border-style: solid; border-width: 1px; border-color: #090; background-color: #dfd; text-align:left; margin-top: 5px; margin-bottom: 5px}
.informationMacroPadding { padding: 5px 0 0 5px; }

table.infoMacro td, table.warningMacro td, table.tipMacro td, table.noteMacro td, table.sectionMacro td {
    border: none;
}

table.sectionMacroWithBorder td.columnMacro { border-style: dashed; border-width: 1px; border-color: #cccccc;}

.pagecontent
{
    padding: 10px;
    text-align: left;
}

/* styles for links in the top bar */
.topBarDiv a:link {color: #ffffff;}
.topBarDiv a:visited {color: #ffffff;}
.topBarDiv a:active {color: #ffffff;}
.topBarDiv a:hover {color: #ffffff;}
.topBarDiv {color: #ffffff;}

.topBar {
    background-color: #003366;
}


/* styles for extended operations */
.greyLinks a:link {color: #666666; text-decoration:underline;}
.greyLinks a:visited {color: #666666; text-decoration:underline;}
.greyLinks a:active {color: #666666; text-decoration:underline;}
.greyLinks a:hover {color: #666666; text-decoration:underline;}
.greyLinks {color: #666666; display:block; padding: 10px}

.logoSpaceLink {color: #999999; text-decoration: none}
.logoSpaceLink a:link {color: #999999; text-decoration: none}
.logoSpaceLink a:visited {color: #999999; text-decoration: none}
.logoSpaceLink a:active {color: #999999; text-decoration: none}
.logoSpaceLink a:hover {color: #003366; text-decoration: none}

/* basic panel (basicpanel.vmd) style */
.basicPanelContainer {border: 1px solid #3c78b5; margin-top: 2px; margin-bottom: 8px; width: 100%}
.basicPanelTitle {padding: 5px; margin: 0px; background-color: #f0f0f0; color: black; font-weight: bold;}
.basicPanelBody {padding: 5px; margin: 0px}

.separatorLinks a:link {color: white}
.separatorLinks a:visited {color: white}
.separatorLinks a:active {color: white}

.greynavbar {background-color: #f0f0f0; border-top: 1px solid #3c78b5; margin-top: 2px}

div.headerField {
    float: left;
    width: auto;
    height: 100%;
}

.headerFloat {
    margin-left: auto;
    width: 50%;
}

.headerFloatLeft {
    float: left;
    margin-right: 20px;
    margin-bottom: 10px;
}

#headerRow {
    padding: 10px;
}

div.license-personal {
   background-color: #003366;
   color: #ffffff;
}

div.license-personal a {
   color: #ffffff;
}

.greyFormBox {
    border: 1px solid #cccccc;
    padding: 5px;
}

/* IE automatically adds a margin before and after form tags. Use this style to remove that */
.marginlessForm {
    margin: 0px;
}

.openPageHighlight {
    background-color: #ffffcc;
    padding: 2px;
    border: 1px solid #ddd;
}

.editPageInsertLinks, .editPageInsertLinks a
{
    color: #666666;
    font-weight: bold;
    font-size: 10px;
}

/* Style for label heatmap. */
.top10 a {
    font-weight: bold;
    font-size: 2em;
    color: #003366;
}
.top25 a {
    font-weight: bold;
    font-size: 1.6em;
    color: #003366;
}
.top50 a {
    font-size: 1.4em;
    color: #003366;
}
.top100 a {
    font-size: 1.2em;
    color: #003366;
}

.heatmap {
    list-style:none;
    width: 95%;
    margin: 0px auto;
}

.heatmap a {
    text-decoration:none;
}

.heatmap a:hover {
    text-decoration:underline;
}

.heatmap li {
    display: inline;
}

.minitab {
padding: 3px 0px 3px 8px;
margin-left: 0;
margin-top: 1px;
margin-bottom: 0px;
border-bottom: 1px solid #3c78b5;
font: bold 9px Verdana, sans-serif;
text-decoration: none;
float:none;
}
.selectedminitab {
padding: 3px 0.5em;
margin-left: 3px;
margin-top: 1px;
border: 1px solid #3c78b5;
background: white;
border-bottom: 1px solid white;
color: #000000;
text-decoration: none;
}
.unselectedminitab {
padding: 3px 0.5em;
margin-left: 3px;
margin-top: 1px;
border: 1px solid #3c78b5;
border-bottom: none;
background: #3c78b5;
color: #ffffff;
text-decoration: none;
}

a.unselectedminitab:hover {
color: #ffffff;
background: #003366;
border-color: #003366;
}

a.unselectedminitab:link { color: white; }
a.unselectedminitab:visited { color: white; }

a.selectedminitab:link { color: black; }
a.selectedminitab:visited { color: black; }

.linkerror { background-color: #fcc;}

a.labelOperationLink:link {text-decoration: underline}
a.labelOperationLink:active {text-decoration: underline}
a.labelOperationLink:visited {text-decoration: underline}
a.labelOperationLink:hover {text-decoration: underline}

a.newLabel:link {background-color: #ddffdd}
a.newLabel:active {background-color: #ddffdd}
a.newLabel:visited {background-color: #ddffdd}
a.newLabel:hover {background-color: #ddffdd}

ul.square {list-style-type: square}

.inline-control-link {
    background: #ffc;
    font-size: 9px;
    color: #666;
    padding: 2px;
    text-transform: uppercase;
    text-decoration: none;
}


.inline-control-link a:link {text-decoration: none}
.inline-control-link a:active {text-decoration: none}
.inline-control-link a:visited {text-decoration: none}
.inline-control-link a:hover {text-decoration: none}

.inline-control-link {
    background: #ffc;
    font-size: 9px;
    color: #666;
    padding: 2px;
    text-transform: uppercase;
    text-decoration: none;
    cursor: pointer;
}

div.auto_complete {
    width: 350px;
    background: #fff;
}
div.auto_complete ul {
    border: 1px solid #888;
    margin: 0;
    padding: 0;
    width: 100%;
    list-style-type: none;
}
div.auto_complete ul li {
    margin: 0;
    padding: 3px;
}
div.auto_complete ul li.selected {
    background-color: #ffb;
}
div.auto_complete ul strong.highlight {
    color: #800;
    margin: 0;
    padding: 0;
}

/******* Edit Page Styles *******/
.toogleFormDiv{
    border:1px solid #A7A6AA;
    background-color:white;
    padding:5px;
    margin-top: 5px;
}

.toogleInfoDiv{
    border:1px solid #A7A6AA;
    background-color:white;
    display:none;
    padding:5px;
    margin-top: 10px;
}

.inputSection{
    margin-bottom:20px;
}

#editBox{
   border:1px solid lightgray;
   background-color:#F0F0F0;
}

/******* Left Navigation Theme Styles ********/
.leftnav li a {
    text-decoration:none;
    color:white;
    margin:0px;
    display:block;
    padding:2px;
    padding-left:5px;
    background-color: #3c78b5;
    border-top:1px solid #3c78b5;
}

.leftnav li a:active {color:white;}
.leftnav li a:visited {color:white;}
.leftnav li a:hover {background-color: #003366; color:white;}

/* Added by Shaun during i18n */
.replaced
{
    background-color: #33CC66;
}

.topPadding
{
    margin-top: 20px;
}

/* new form style */
.form-block {
    padding: 6px;
}
.form-error-block {
    padding: 6px;
    background: #fcc;
    border-top: #f0f0f0 1px solid;
    border-bottom: #f0f0f0 1px solid;
    margin-bottom: 6px;
    padding: 0 12px 0 12px;
}
.form-element-large {
    font-size: 16px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
}

.form-element-small {
    font-size: 12px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
}

.form-header {
    background: lightyellow;
    border-top: #f0f0f0 1px solid;
    border-bottom: #f0f0f0 1px solid;
    margin-bottom: 6px;
    padding: 0 12px 0 12px;
}
.form-header p, .form-block p, .form-error-block p {
    line-height: normal;
    margin: 12px 0 12px 0;
}
.form-example {
    color: #888;
    font-size: 11px;
}
.form-divider {
    border-bottom: #ccc 1px solid;
    margin-bottom: 6px;
}
.form-buttons {
    margin-top: 6px;
    border-top: #ccc 1px solid;
    border-bottom: #ccc 1px solid;
    background: #f0f0f0;
    padding: 10px;
    text-align: center;
}
.form-buttons input {
    width: 100px;
}
.form-block .error {
    padding: 6px;
    margin-bottom: 6px;
}
    -->
    </style>
</head>
<body>

<div id="PageContent">
<table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%"><tr>
<td valign="top" class="pagebody">

    <div class="pageheader">
        <span class="pagetitle">
            Page Edited :
            <a href="http://cwiki.apache.org/confluence/display/GMOxDOC22">GMOxDOC22</a> :
            <a href="http://cwiki.apache.org/confluence/display/GMOxDOC22/Java+Persistence+API+deployment+plans">Java Persistence API deployment plans</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/GMOxDOC22/Java+Persistence+API+deployment+plans">Java Persistence API deployment plans</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~phanibalaji">Phani Balaji Madgula</a>
            <span class="smallfont">(Jun 05, 2008)</span>.
     </p>
    
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=93395&originalVersion=17&revisedVersion=18">(View changes)</a>
     </p>

    <span class="label">Content:</span><br/>
    <div class="greybox wiki-content"><style type='text/css'>/*<![CDATA[*/
table.ScrollbarTable  {border: none;padding: 3px;width: 100%;padding: 3px;margin: 0px;background-color: #f0f0f0}
table.ScrollbarTable td.ScrollbarPrevIcon {text-align: center;width: 16px;border: none;}
table.ScrollbarTable td.ScrollbarPrevName {text-align: left;border: none;}
table.ScrollbarTable td.ScrollbarParent {text-align: center;border: none;}
table.ScrollbarTable td.ScrollbarNextName {text-align: right;border: none;}
table.ScrollbarTable td.ScrollbarNextIcon {text-align: center;width: 16px;border: none;}

/*]]>*/</style><div class="Scrollbar"><table class='ScrollbarTable'><tr><td class='ScrollbarPrevIcon'><a href="/confluence/display/GMOxDOC22/geronimo-web.xml"><img border='0' align='middle' src='/confluence/images/icons/back_16.gif' width='16' height='16'></a></td><td width='33%' class='ScrollbarPrevName'><a href="/confluence/display/GMOxDOC22/geronimo-web.xml">geronimo-web.xml</a>&nbsp;</td><td width='33%' class='ScrollbarParent'><sup><a href="/confluence/display/GMOxDOC22/Creating+deployment+plans"><img border='0' align='middle' src='/confluence/images/icons/up_16.gif' width='8' height='8'></a></sup><a href="/confluence/display/GMOxDOC22/Creating+deployment+plans">Creating deployment plans</a></td><td width='33%' class='ScrollbarNextName'>&nbsp;<a href="/confluence/display/GMOxDOC22/openejb-jar.xml">openejb-jar.xml</a></td><td class='ScrollbarNextIcon'><a href="/confluence/display/GMOxDOC22/openejb-jar.xml"><img border='0' align='middle' src='/confluence/images/icons/forwd_16.gif' width='16' height='16'></a></td></tr></table></div>

<h1><a name="JavaPersistenceAPIdeploymentplans-JavaPersistenceAPI"></a>Java Persistence API </h1>
<p>The Java Persistence API is a new programming model under EJB3.0 specification (JSR220) for the management of persistence and object/relational mapping with Java EE and Java SE. With JPA, developers can easily develop java applications that perform operations on relational database management systems using java objects and mapping. In that way, java applications developed using JPA are not only portable across different platforms, but also applications can be easily developed using simple yet powerful programming model provided by JPA. This greatly improves application maintainability against ever changing database world. JPA insulates applications from all the complexity and non-portable boilerplate code involved in database connectivity and operations. Apache geronimo uses <span class="nobr"><a href="http://openjpa.apache.org/" title="Visit page outside Confluence" rel="nofollow">OpenJPA<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> for providing Java Persistence API to Java EE applications deployed in the server. Below sections illustrate developing applications using JPA and how to write various deployment descriptors and plans for apache geronimo.</p>

<p>The document is organized as follows.</p>
<div>
<ul>
  <li><a href='#JavaPersistenceAPIdeploymentplans-JavaPersistenceAPI'>Java Persistence API </a>
<ul>
  <li><a href='#JavaPersistenceAPIdeploymentplans-Inheritancerelationshipinentities'>Inheritance relationship in entities</a>
<ul>
  <li><a href='#JavaPersistenceAPIdeploymentplans-Singledatabasetableperclasshierarchy'>Single database table per class hierarchy</a></li>
</ul></li>
</ul></li>
</ul></div>

<h2><a name="JavaPersistenceAPIdeploymentplans-ShareAccountsample"></a>ShareAccount sample</h2>
<p>This example illustrates developing an enterprise application that uses JPA for persistence. The database used is the embedded derby shipped with apache geronimo. Here, we present a persistence deployment descriptor (<tt>persistence.xml</tt>) that contains database connectivity and other information for the application. The <tt>persistence.xml</tt> is placed under <tt>META-INF/</tt> directory of the application archive. The application contains an ejb module and a web module. Ejb module uses a stateless session bean <tt>ShareHolderBean</tt> that uses JPA to perform database operations on the table <tt>SHAREACCOUNT</tt> in the <tt>ShareDB</tt> derby database. The <tt>SHAREACCOUNT</tt> table contains information about each shareholder along with the information regarding number shares he or she possesses currently in the account. The <tt>ShareHolderBean</tt> has methods that retrieve shareholder information, buy/sell shares of a particular shareholder, close the shareholder account etc. The web application has a servlet that looks up the <tt>ShareHolderBean</tt> and trigger the operations on it. The deployment descriptor information for the ejb module is provided using Java EE annotations in the respective bean classes. However, the persistence deployment descriptor information is provided using <tt>META-INF/persistence.xml</tt> file.</p>

<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>sample.jpa.ShareAccount.java</b></div><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> sample.jpa;
<span class="code-keyword">import</span> java.io.Serializable;
<span class="code-keyword">import</span> javax.persistence.Entity;
<span class="code-keyword">import</span> javax.persistence.Id;
<span class="code-keyword">import</span> javax.persistence.NamedQuery;
<span class="code-keyword">import</span> javax.persistence.PostLoad;
<span class="code-keyword">import</span> javax.persistence.PostUpdate;
<span class="code-keyword">import</span> javax.persistence.PrePersist;
<span class="code-keyword">import</span> javax.persistence.PreUpdate;
<span class="code-keyword">import</span> javax.persistence.Version;
<span class="code-keyword">import</span> javax.persistence.Table;

@Entity
@Table(name = <span class="code-quote">"SHAREACCOUNT"</span>)
@NamedQuery(name=<span class="code-quote">"findThem"</span>, query=<span class="code-quote">"SELECT a FROM ShareAccount a"</span>)
<span class="code-keyword">public</span> class ShareAccount <span class="code-keyword">implements</span> Serializable {

   
    @Id
    <span class="code-keyword">private</span> <span class="code-object">int</span> shareAccountNo;
    <span class="code-keyword">private</span> <span class="code-object">String</span> ownerName;
    <span class="code-keyword">private</span> <span class="code-object">int</span> numberOfShares;
    @Version
    <span class="code-keyword">private</span> <span class="code-object">int</span> version;

    <span class="code-keyword">public</span> ShareAccount(<span class="code-object">int</span> shareAccountNo, 
                        <span class="code-object">String</span> ownerName, 
                        <span class="code-object">int</span> numberOfShares) {

      <span class="code-keyword">this</span>.shareAccountNo = shareAccountNo;
      <span class="code-keyword">this</span>.ownerName = ownerName;
      <span class="code-keyword">this</span>.numberOfShares = numberOfShares;
        
    }

    <span class="code-keyword">public</span> <span class="code-object">String</span> toString() {
        <span class="code-keyword">return</span> <span class="code-quote">"Acc.# "</span> + shareAccountNo +
               <span class="code-quote">", owner"</span> + ownerName + 
               <span class="code-quote">", numberOfShares: "</span> + 
                  numberOfShares + <span class="code-quote">" $"</span>;
    }

    @PrePersist
    void prepersist() {
        <span class="code-object">System</span>.out.println(<span class="code-quote">"pre persist!!"</span>);
    }
    
    @PreUpdate
    void preupdate() {
        <span class="code-object">System</span>.out.println(<span class="code-quote">"pre update!!"</span>);
    }
    
    @PostUpdate
    void postupdate() {
        <span class="code-object">System</span>.out.println(<span class="code-quote">"post update!!"</span>);
    }
    
    @PostLoad
    void postload() {
        <span class="code-object">System</span>.out.println(<span class="code-quote">"post load!!"</span>);
    }

	<span class="code-keyword">public</span> <span class="code-object">int</span> getShareAccountNo() {
		<span class="code-keyword">return</span> shareAccountNo;
	}

	<span class="code-keyword">public</span> void setShareAccountNo(<span class="code-object">int</span> shareAccountNo) {
		<span class="code-keyword">this</span>.shareAccountNo = shareAccountNo;
	}

	<span class="code-keyword">public</span> <span class="code-object">String</span> getOwnerName() {
		<span class="code-keyword">return</span> ownerName;
	}

	<span class="code-keyword">public</span> void setOwnerName(<span class="code-object">String</span> ownerName) {
		<span class="code-keyword">this</span>.ownerName = ownerName;
	}

	<span class="code-keyword">public</span> <span class="code-object">int</span> getNumberOfShares() {
		<span class="code-keyword">return</span> numberOfShares;
	}

	<span class="code-keyword">public</span> void setNumberOfShares(<span class="code-object">int</span> numberOfShares) {
		<span class="code-keyword">this</span>.numberOfShares = numberOfShares;
	}

	<span class="code-keyword">public</span> <span class="code-object">int</span> getVersion() {
		<span class="code-keyword">return</span> version;
	}

	<span class="code-keyword">public</span> void setVersion(<span class="code-object">int</span> version) {
		<span class="code-keyword">this</span>.version = version;
	}
  
}</pre>
</div></div>
<p>Observe various annotations that represent various aspects of the entity in the class.</p>

<p><tt>@Entity</tt> : Marks the <tt>ShareAccount</tt> class as an entity that can be persisted entirely in the database.<br/>
<tt>@Table(name = "SHAREACCOUNT")</tt> : Designates the database table <tt>SHAREACCOUNT</tt> to the entity. The columns in the database table map to the attributes of <tt>ShareAccount</tt> entity. <br/>
<tt>@Id</tt> : This annotation designates primary key to the entity. In this case, it is the <tt>shareAccountNo</tt> attribute of the entity class.<br/>
<tt>@NamedQuery(name="findAccounts", query="SELECT a FROM ShareAccount a")</tt> : This annotation declares a named query by name <tt>findAccounts</tt>. This query retrieves all the share accounts from the database. Later in the <tt>ShareHolderBean</tt>, the NamedQuery is executed by using the name <tt>findAccounts</tt>.<br/>
<tt>@Version</tt> : The version attribute of the <tt>ShareAccount</tt> entity. </p>

<p>The annotations placed around some of the methods of the <tt>ShareAccount</tt> class are <tt>@PrePersist, @PreUpdate, @PostUpdate and @PostLoad</tt>. These are the callback methods called by persistence container when corresponding database operations are performed on the entity.</p>

<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>sample.jpa.ShareHolder.java</b></div><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> sample.jpa;
<span class="code-keyword">import</span> java.util.List;

<span class="code-keyword">public</span> <span class="code-keyword">interface</span> ShareHolder {

    <span class="code-keyword">public</span> ShareAccount openShareAccount(<span class="code-object">int</span> shareHolderNo, <span class="code-object">String</span> ownerName, <span class="code-object">int</span> numberOfShares);
    <span class="code-keyword">public</span> ShareAccount findShareAccount(<span class="code-object">int</span> shareHolderNo);
    <span class="code-keyword">public</span> ShareAccount close(<span class="code-object">int</span> shareHolderNo);
    <span class="code-keyword">public</span> List&lt;ShareAccount&gt; listAccounts();
    <span class="code-keyword">public</span> ShareAccount buyShares(<span class="code-object">int</span> shareHolderNo, <span class="code-object">int</span> numberOfShares);
    <span class="code-keyword">public</span> <span class="code-object">int</span> sellShares(<span class="code-object">int</span> shareHolderNo, <span class="code-object">int</span> numberOfShares);   
    <span class="code-keyword">public</span> ShareAccount updateShareAccount(ShareAccount sa);
}</pre>
</div></div>
<p>The <tt>ShareHolder.java</tt> is the remote interface of the stateless session bean.  </p>

<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>sample.jpa.ShareHolderBean.java</b></div><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> sample.jpa;
<span class="code-keyword">import</span> java.util.List;
<span class="code-keyword">import</span> javax.ejb.Stateless;
<span class="code-keyword">import</span> javax.ejb.Remote;
<span class="code-keyword">import</span> javax.persistence.*;
<span class="code-keyword">import</span> javax.ejb.TransactionManagement;
<span class="code-keyword">import</span> javax.ejb.TransactionManagementType;

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER) 
@Remote(ShareHolder.class)
<span class="code-keyword">public</span> class ShareHolderBean <span class="code-keyword">implements</span> ShareHolder { 
  
    @PersistenceContext
    <span class="code-keyword">private</span> EntityManager manager;

    <span class="code-keyword">public</span> ShareAccount openShareAccount(<span class="code-object">int</span> shareHolderNo, 
                                         <span class="code-object">String</span> ownerName, 
                                         <span class="code-object">int</span> numberOfShares){
    	
    	<span class="code-keyword">if</span> (findShareAccount(shareHolderNo) == <span class="code-keyword">null</span>){
    		ShareAccount sa = <span class="code-keyword">new</span> ShareAccount
                                 (shareHolderNo,
                                  ownerName,
                                  numberOfShares);
        	manager.persist(sa);
        	<span class="code-keyword">return</span> sa;
    	}
    	<span class="code-keyword">return</span> <span class="code-keyword">null</span>;
    }

    <span class="code-keyword">public</span> ShareAccount findShareAccount(<span class="code-object">int</span> shareHolderNo){
    	ShareAccount sa = manager.find(ShareAccount.class, 
                                       shareHolderNo);
    	<span class="code-keyword">return</span> sa;
    }
    
    <span class="code-keyword">public</span> ShareAccount close(<span class="code-object">int</span> shareHolderNo){
    	ShareAccount sa = manager.find(ShareAccount.class, 
                                       shareHolderNo);   
    	<span class="code-keyword">if</span> (sa != <span class="code-keyword">null</span>)manager.remove(sa);
    	<span class="code-keyword">return</span> sa;

    }
    
    <span class="code-keyword">public</span> List&lt;ShareAccount&gt; listAccounts(){
        Query query = manager.createNamedQuery(<span class="code-quote">"findThem"</span>);
        <span class="code-keyword">return</span> query.getResultList();
    }
    
    <span class="code-keyword">public</span> ShareAccount buyShares(<span class="code-object">int</span> shareHolderNo, 
                                  <span class="code-object">int</span> numberOfShares){
    	ShareAccount sa = manager.find(ShareAccount.class, 
                                       shareHolderNo);
    	<span class="code-keyword">if</span>(sa != <span class="code-keyword">null</span>){
    		<span class="code-object">int</span> new_balance = sa.getNumberOfShares() 
                                  + numberOfShares; 
    	    sa.setNumberOfShares(new_balance);  
    	}
    	<span class="code-keyword">return</span> sa;
    }
    
    <span class="code-keyword">public</span> <span class="code-object">int</span> sellShares(<span class="code-object">int</span> shareHolderNo, 
                          <span class="code-object">int</span> numberOfShares){
        ShareAccount sa = manager.find(ShareAccount.class, 
                                       shareHolderNo);
        <span class="code-keyword">if</span>(sa != <span class="code-keyword">null</span>){
            <span class="code-keyword">if</span> (numberOfShares &gt; sa.getNumberOfShares()){
            	<span class="code-keyword">return</span> -2;
            }<span class="code-keyword">else</span>{
            	<span class="code-object">int</span> new_balance = sa.getNumberOfShares() 
                                  - numberOfShares;
            	sa.setNumberOfShares(new_balance);
            	manager.flush();
            	<span class="code-keyword">return</span> numberOfShares;
            }
        }<span class="code-keyword">else</span>{
        	<span class="code-keyword">return</span> -1;
        }
    }
    
    <span class="code-keyword">public</span> ShareAccount updateShareAccount(ShareAccount sa){
    	ShareAccount sa1 = 
                   findShareAccount(sa.getShareAccountNo());
    	<span class="code-keyword">if</span> (sa1 != <span class="code-keyword">null</span>){
    		manager.merge(sa1);
    		<span class="code-keyword">return</span> sa1;
    	}
    	<span class="code-keyword">else</span> <span class="code-keyword">return</span> <span class="code-keyword">null</span>;
    	 
    }

    
}</pre>
</div></div>
<p>The <tt>ShareHolderBean.java</tt> is the stateless session bean that uses JPA to perform database operations using <tt>ShareAccount</tt> entity.</p>

<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>Persistence.xml</b></div><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;?xml version=<span class="code-quote">"1.0"</span> encoding=<span class="code-quote">"UTF-8"</span>?&gt;</span>
&lt;persistence xmlns=<span class="code-quote">"http://java.sun.com/xml/ns/persistence"</span>
  <span class="code-keyword">xmlns:xsi</span>=<span class="code-quote">"http://www.w3.org/2001/XMLSchema-instance"</span> version=<span class="code-quote">"1.0"</span>
  xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
  http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"&gt;

 <span class="code-tag">&lt;persistence-unit name=<span class="code-quote">"PersistencePU"</span>&gt;</span>
 <span class="code-tag">&lt;description&gt;</span>ShareHolder<span class="code-tag">&lt;/description&gt;</span>
 <span class="code-tag">&lt;provider&gt;</span>
  org.apache.openjpa.persistence.PersistenceProviderImpl
 <span class="code-tag">&lt;/provider&gt;</span>
 <span class="code-tag">&lt;class&gt;</span>sample.jpa.ShareAccount<span class="code-tag">&lt;/class&gt;</span>
 <span class="code-tag">&lt;properties&gt;</span>
  &lt;property name=<span class="code-quote">"openjpa.ConnectionURL"</span> 
           value=<span class="code-quote">"jdbc:derby:ShareDB"</span> /&gt;
  &lt;property name=<span class="code-quote">"openjpa.ConnectionDriverName"</span> 
           value=<span class="code-quote">"org.apache.derby.jdbc.EmbeddedDriver"</span> /&gt;
  <span class="code-tag">&lt;property name=<span class="code-quote">"ConnectionUserName"</span> value=<span class="code-quote">"app"</span> /&gt;</span>
  <span class="code-tag">&lt;property name=<span class="code-quote">"openjpa.jdbc.SynchronizeMappings"</span> value=<span class="code-quote">"false"</span> /&gt;</span>
 <span class="code-tag">&lt;/properties&gt;</span>
 <span class="code-tag">&lt;/persistence-unit&gt;</span>
 &lt;!--
 <span class="code-tag">&lt;jta-data-source&gt;</span>PhoneBookPool<span class="code-tag">&lt;/jta-data-source&gt;</span>
 <span class="code-tag">&lt;non-jta-data-source&gt;</span>PhoneBookPool<span class="code-tag">&lt;/non-jta-data-source&gt;</span>
 --&gt;
<span class="code-tag">&lt;/persistence&gt;</span></pre>
</div></div>
<p>The <tt>Persistence.xml</tt> is the persistence deployment descriptor for the ejb module. It provides database connection information and declares entity classes among other things. </p>
<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p>The default namespace of the above XML document is <span class="nobr"><a href="http://java.sun.com/xml/ns/persistence" title="Visit page outside Confluence" rel="nofollow">http://java.sun.com/xml/ns/persistence<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>. The XML elements that do not have a namespace prefix belong to the default namespace.</p></td></tr></table>

<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>sample.jpa.Test.java</b></div><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> sample.jpa;

<span class="code-keyword">import</span> java.io.IOException;
<span class="code-keyword">import</span> java.io.PrintWriter;
<span class="code-keyword">import</span> java.util.List;

<span class="code-keyword">import</span> javax.naming.Context;
<span class="code-keyword">import</span> javax.naming.InitialContext;
<span class="code-keyword">import</span> javax.servlet.ServletException;
<span class="code-keyword">import</span> javax.servlet.http.HttpServletRequest;
<span class="code-keyword">import</span> javax.servlet.http.HttpServletResponse;

<span class="code-keyword">public</span> class Test <span class="code-keyword">extends</span> 
  javax.servlet.http.HttpServlet 
  <span class="code-keyword">implements</span> javax.servlet.Servlet {
  
  <span class="code-keyword">static</span> <span class="code-keyword">final</span> <span class="code-object">long</span> serialVersionUID = 1L;
   
   <span class="code-keyword">public</span> Test() {
	<span class="code-keyword">super</span>();
   }   	
	
   <span class="code-keyword">protected</span> void doGet(HttpServletRequest request,
                  HttpServletResponse response) 
                  <span class="code-keyword">throws</span> ServletException, 
                  IOException {
				
    PrintWriter out = response.getWriter();
	        
    <span class="code-keyword">try</span> {
     java.util.Properties env = 
       <span class="code-keyword">new</span> java.util.Properties();

     env.put(Context.INITIAL_CONTEXT_FACTORY
       ,<span class="code-quote">"org.apache.openejb.client.RemoteInitialContextFactory"</span>); 
     env.put(Context.PROVIDER_URL, 
             <span class="code-quote">"ejbd:<span class="code-comment">//127.0.0.1:4201"</span>);
</span>	    		
     Context ctx = <span class="code-keyword">new</span> InitialContext(env);
     out.println(<span class="code-quote">"Looking up ShareHolderBean"</span>);

     ShareHolder shareHolder = (ShareHolder)
            ctx.lookup(<span class="code-quote">"ShareHolderBeanRemote"</span>);
	            
     out.println("Creating ShareAccount 1, 
                   Phani, 10");
	            
     ShareAccount sa = 
         shareHolder.openShareAccount(1,<span class="code-quote">"phani"</span>, 10);
     <span class="code-keyword">if</span>(sa == <span class="code-keyword">null</span>){
	out.println(<span class="code-quote">"account could not be created."</span>);
	out.println("May be, account already 
                            exists. Check the database.");
           	
     }
     <span class="code-keyword">else</span> {
        out.println(<span class="code-quote">"Account is successfully created"</span>);
     }
     out.println(<span class="code-quote">"Looking up the ShareAccountNumber 1"</span>);
     sa = shareHolder.findShareAccount(1);
     out.println(<span class="code-quote">"Printing the details of ShareAccountNumber 1"</span>);
     printShareAccount(sa,out);
     out.println("");

     out.println(<span class="code-quote">"buying shares 100"</span>);
     sa = shareHolder.buyShares(1, 100);
	            
     out.println(<span class="code-quote">"Printing the details of ShareAccountNumber 1"</span>);
     printShareAccount(sa,out);
     out.println("");

     out.println(<span class="code-quote">"selling 50 shares of ShareAccountNumber 1"</span>);
     <span class="code-object">int</span> numberShares = shareHolder.sellShares(1, 50);
     <span class="code-keyword">if</span>(numberShares == 50){
       out.println(<span class="code-quote">"Printing the details of ShareAccountNumber 1"</span>);
       sa = shareHolder.findShareAccount(1);
       printShareAccount(sa,out);
     }
     <span class="code-keyword">else</span> <span class="code-keyword">if</span>(numberShares == -1){
       out.println(<span class="code-quote">"ShareAccountNo can not be found"</span>);
     }<span class="code-keyword">else</span> {
       out.println(<span class="code-quote">"The number shares available are less than 50"</span>);
     }
     out.println("");

     List&lt;ShareAccount&gt; saList = shareHolder.listAccounts();
     out.println(<span class="code-quote">"Printing all the available accounts"</span>);
     <span class="code-keyword">for</span> (<span class="code-object">int</span> i = 0; i &lt; saList.size(); i++){
		out.println(<span class="code-quote">"*******"</span>);
		printShareAccount(saList.get(i),out);
		out.println(<span class="code-quote">"*******"</span>);
		out.println("");
	}
     out.println("");

     out.println("Setting the ShareAccount 1 with 500 shares 
                  and updating the database");
     sa = <span class="code-keyword">new</span> ShareAccount(1,<span class="code-quote">"phani"</span>,0);
     sa.setNumberOfShares(500);
     shareHolder.updateShareAccount(sa);
     out.println(<span class="code-quote">"Printing the details of ShareAccountNumber 1"</span>);
     printShareAccount(sa,out);
     out.println("");

     out.println(<span class="code-quote">"Closing ShareAccountNumber 1"</span>);
     sa = shareHolder.close(1);
     <span class="code-keyword">if</span>(sa == <span class="code-keyword">null</span>){
        out.println(<span class="code-quote">"Account is not found="</span>+1);
     }<span class="code-keyword">else</span>{
        out.println(<span class="code-quote">"Printing the details of ShareAccountNumber 1"</span>);
	printShareAccount(sa,out);
     }

   }
   <span class="code-keyword">catch</span>(Exception e){
     e.printStackTrace();
     <span class="code-keyword">throw</span> <span class="code-keyword">new</span> ServletException(e);
   }
}  	

 <span class="code-keyword">protected</span> void doPost(HttpServletRequest request, 
                      HttpServletResponse response) 
                  <span class="code-keyword">throws</span> ServletException, IOException {
		
 }  
 <span class="code-keyword">private</span> void printShareAccount(ShareAccount sa, PrintWriter out){
    <span class="code-keyword">if</span>(sa != <span class="code-keyword">null</span>){
    out.println(<span class="code-quote">"Account <span class="code-object">Number</span> = "</span>+sa.getShareAccountNo());
    out.println(<span class="code-quote">"Owner Name = "</span>+sa.getOwnerName());
    out.println(<span class="code-quote">"number of shares "</span>+sa.getNumberOfShares());
    out.println(<span class="code-quote">"version="</span>+sa.getVersion());
    }<span class="code-keyword">else</span>{
     out.println(<span class="code-quote">"ShareAccountNo can not be found"</span>);
    }
 }
}</pre>
</div></div>

<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>web.xml</b></div><div class="codeContent">
<pre class="code-xml">&lt;!--
The deployment descriptor of the web client.
--&gt;
<span class="code-tag">&lt;?xml version=<span class="code-quote">"1.0"</span> encoding=<span class="code-quote">"UTF-8"</span>?&gt;</span>
&lt;web-app <span class="code-keyword">xmlns:xsi</span>=<span class="code-quote">"http://www.w3.org/2001/XMLSchema-instance"</span> 
         xmlns=<span class="code-quote">"http://java.sun.com/xml/ns/javaee"</span> 
         <span class="code-keyword">xmlns:web</span>=<span class="code-quote">"http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"</span> 
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
         id=<span class="code-quote">"WebApp_ID"</span> version=<span class="code-quote">"2.5"</span>&gt;

  <span class="code-tag">&lt;display-name&gt;</span>ShareHolderWEB<span class="code-tag">&lt;/display-name&gt;</span>
   <span class="code-tag">&lt;servlet&gt;</span>
    <span class="code-tag">&lt;description&gt;</span><span class="code-tag">&lt;/description&gt;</span>
    <span class="code-tag">&lt;display-name&gt;</span>Test<span class="code-tag">&lt;/display-name&gt;</span>
    <span class="code-tag">&lt;servlet-name&gt;</span>Test<span class="code-tag">&lt;/servlet-name&gt;</span>
    <span class="code-tag">&lt;servlet-class&gt;</span>sample.jpa.Test<span class="code-tag">&lt;/servlet-class&gt;</span>
  <span class="code-tag">&lt;/servlet&gt;</span>
  <span class="code-tag">&lt;servlet-mapping&gt;</span>
    <span class="code-tag">&lt;servlet-name&gt;</span>Test<span class="code-tag">&lt;/servlet-name&gt;</span>
    <span class="code-tag">&lt;url-pattern&gt;</span>/Test<span class="code-tag">&lt;/url-pattern&gt;</span>
  <span class="code-tag">&lt;/servlet-mapping&gt;</span>
<span class="code-tag">&lt;/web-app&gt;</span></pre>
</div></div>

<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>geronimo-web.xml</b></div><div class="codeContent">
<pre class="code-xml">&lt;!--
The geronimo deployment plan of the web client.
--&gt;

<span class="code-tag">&lt;?xml version=<span class="code-quote">"1.0"</span> encoding=<span class="code-quote">"UTF-8"</span>?&gt;</span>
&lt;web-app xmlns=<span class="code-quote">"http://geronimo.apache.org/xml/ns/j2ee/web-2.0.1"</span> 
         <span class="code-keyword">xmlns:naming</span>=<span class="code-quote">"http://geronimo.apache.org/xml/ns/naming-1.2"</span> 
         <span class="code-keyword">xmlns:sec</span>=<span class="code-quote">"http://geronimo.apache.org/xml/ns/security-2.0"</span> 
         <span class="code-keyword">xmlns:sys</span>=<span class="code-quote">"http://geronimo.apache.org/xml/ns/deployment-1.2"</span>&gt;
  <span class="code-tag">&lt;sys:environment&gt;</span>
    <span class="code-tag">&lt;sys:moduleId&gt;</span>
      <span class="code-tag">&lt;sys:groupId&gt;</span>JPA<span class="code-tag">&lt;/sys:groupId&gt;</span>
      <span class="code-tag">&lt;sys:artifactId&gt;</span>ShareHolderWEB<span class="code-tag">&lt;/sys:artifactId&gt;</span>
      <span class="code-tag">&lt;sys:version&gt;</span>1.0<span class="code-tag">&lt;/sys:version&gt;</span>
      <span class="code-tag">&lt;sys:type&gt;</span>car<span class="code-tag">&lt;/sys:type&gt;</span>
    <span class="code-tag">&lt;/sys:moduleId&gt;</span>
  <span class="code-tag">&lt;/sys:environment&gt;</span>
  <span class="code-tag">&lt;context-root&gt;</span>/ShareHolderWEB<span class="code-tag">&lt;/context-root&gt;</span>
<span class="code-tag">&lt;/web-app&gt;</span></pre>
</div></div>

<p>The Servlet client <tt>Test.java</tt>, looks up the <tt>ShareHolderBean</tt> and executes various methods on the <tt>ShareAccount</tt> entity. When the url <span class="nobr"><a href="http://localhost:8080/ShareHolderWEB/Test" title="Visit page outside Confluence" rel="nofollow">http://localhost:8080/ShareHolderWEB/Test<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> is hit on a browser window, the following output is displayed.</p>


<div class="preformatted" style="border-style: solid; "><div class="preformattedHeader" style="border-bottom-style: solid; "><b><span class="nobr"><a href="http://localhost:8080/ShareHolderWEB/Test" title="Visit page outside Confluence" rel="nofollow">http://localhost:8080/ShareHolderWEB/Test<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></b></div><div class="preformattedContent">
<pre>_________________________________________
Looking up ShareHolderBean
Creating ShareAccount 1, Phani, 10
Account is successfully created
Looking up the ShareAccountNumber 1
Printing the details of ShareAccountNumber 1
Account Number = 1
Owner Name = phani
number of shares 10
version=1
_________________________________________

_________________________________________

buying shares 100
Printing the details of ShareAccountNumber 1
Account Number = 1
Owner Name = phani
number of shares 110
version=2
_________________________________________

_________________________________________
selling 50 shares of ShareAccountNumber 1
Printing the details of ShareAccountNumber 1
Account Number = 1
Owner Name = phani
number of shares 60
version=3
_________________________________________

_________________________________________
Printing all the available accounts
*******
Account Number = 1
Owner Name = phani
number of shares 60
version=3
*******
_________________________________________

_________________________________________
Setting the ShareAccount 1 with 500 shares and updating the database
Printing the details of ShareAccountNumber 1
Account Number = 1
Owner Name = phani
number of shares 500
version=0
_________________________________________

_________________________________________
Closing ShareAccountNumber 1
Printing the details of ShareAccountNumber 1
Account Number = 1
Owner Name = null
number of shares 0
version=0
_________________________________________
</pre>
</div></div>
<h2><a name="JavaPersistenceAPIdeploymentplans-Inheritancerelationshipinentities"></a>Inheritance relationship in entities</h2>

<p>Entities can exhibit inheritance relationship among themselves. The entities involved in inheritance relationship can be persisted/updated/retrieved independently. There are several ways of realizing inheritance relationship among entities. There are as follows.</p>

<ul>
	<li>Single database table per class hierarchy</li>
	<li>Separate database table per subclass</li>
	<li>Single database table per concrete entity class</li>
</ul>


<h3><a name="JavaPersistenceAPIdeploymentplans-Singledatabasetableperclasshierarchy"></a>Single database table per class hierarchy</h3>

<p>In this technique, a single database table is designated for entire entity class hierarchy exhibiting inheritance relationship. For example, if entity C extends entity B which extends entity A, the fields of all the entities are stored in a single table. The entities A, B and C can be persisted/updated/deleted/retrieved independently. This technique requires all the columns except for primary columns and columns of parent most entity A, should be nullable. This is because, suppose take the case when an entity B is being inserted. The entity B will have the values for the fields of A and itself but no values for fields of C. Since entire hierarchy uses a single table, the columns pertaining to entity C must be nullable. The same case arises when inserting entity A.</p>

<p>The below example illustrates the use this technique. The enterprise application has 3 entities and uses a single database table to store these entities. A stateless session bean uses JPA to perform DML operations on these entities. The web client looks up the SLSB trigger the operations.</p>

<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>Account</b></div><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> com.sample.jpa;

<span class="code-keyword">import</span> java.io.Serializable;

<span class="code-keyword">import</span> javax.persistence.DiscriminatorColumn;
<span class="code-keyword">import</span> javax.persistence.DiscriminatorType;
<span class="code-keyword">import</span> javax.persistence.DiscriminatorValue;
<span class="code-keyword">import</span> javax.persistence.Entity;
<span class="code-keyword">import</span> javax.persistence.Id;
<span class="code-keyword">import</span> javax.persistence.Inheritance;
<span class="code-keyword">import</span> javax.persistence.InheritanceType;
<span class="code-keyword">import</span> javax.persistence.Table;

@Entity
@Table(name=<span class="code-quote">"Account"</span>)
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name=<span class="code-quote">"ACCOUNTTYPE"</span>, 
 discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue(<span class="code-quote">"ACCOUNT"</span>)
<span class="code-keyword">public</span> <span class="code-keyword">abstract</span> class Account 
       <span class="code-keyword">implements</span> Serializable{
	
 @Id
 <span class="code-keyword">private</span> <span class="code-object">int</span> accountNo;
 <span class="code-keyword">private</span> <span class="code-object">String</span> name;
 <span class="code-keyword">private</span> <span class="code-object">String</span> address;
 <span class="code-keyword">private</span> <span class="code-object">int</span> branchCode;
	
 <span class="code-keyword">public</span> Account(){
  <span class="code-keyword">this</span>.accountNo = 0;
  <span class="code-keyword">this</span>.name = <span class="code-quote">"DUMMY"</span>;
  <span class="code-keyword">this</span>.address = <span class="code-quote">"DUMMY"</span>;
  <span class="code-keyword">this</span>.branchCode = 0;
 }
	
 <span class="code-keyword">public</span> <span class="code-object">int</span> getAccountNo() {
  <span class="code-keyword">return</span> accountNo;
 }
 <span class="code-keyword">public</span> void setAccountNo(<span class="code-object">int</span> accountNo) {
  <span class="code-keyword">this</span>.accountNo = accountNo;
 }
 <span class="code-keyword">public</span> <span class="code-object">String</span> getName() {
  <span class="code-keyword">return</span> name;
 }
 <span class="code-keyword">public</span> void setName(<span class="code-object">String</span> name) {
  <span class="code-keyword">this</span>.name = name;
 }
 <span class="code-keyword">public</span> <span class="code-object">String</span> getAddress() {
  <span class="code-keyword">return</span> address;
 }
 <span class="code-keyword">public</span> void setAddress(<span class="code-object">String</span> address) {
  <span class="code-keyword">this</span>.address = address;
 }
 <span class="code-keyword">public</span> <span class="code-object">int</span> getBranchCode() {
  <span class="code-keyword">return</span> branchCode;
 }
 <span class="code-keyword">public</span> void setBranchCode(<span class="code-object">int</span> branchCode) {
  <span class="code-keyword">this</span>.branchCode = branchCode;
 }

}</pre>
</div></div>
<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p><tt>@DiscriminatorColumn</tt> annotation designates table column to be used to discriminate rows that correspond to different entities in the class hierarchy.  <tt>@DiscriminatorValue</tt> annotation provides value that corresponds to the <tt>Account</tt> entity for the <tt>DiscriminatorColumn</tt>. The value is <tt>Account</tt>. Note that the Account entity class is declared as an abstract class. This is to prevent applications from instantiating Account objects. The intention is, to allow instantiating only sub entities <tt>SavingsAccount</tt> and <tt>CurrentAccount</tt> as given below. </p></td></tr></table>
<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>SavingsAccount</b></div><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> com.sample.jpa;

<span class="code-keyword">import</span> javax.persistence.DiscriminatorColumn;
<span class="code-keyword">import</span> javax.persistence.DiscriminatorType;
<span class="code-keyword">import</span> javax.persistence.DiscriminatorValue;
<span class="code-keyword">import</span> javax.persistence.Entity;
<span class="code-keyword">import</span> javax.persistence.Inheritance;
<span class="code-keyword">import</span> javax.persistence.InheritanceType;
<span class="code-keyword">import</span> javax.persistence.Table;

@Entity
@Table(name=<span class="code-quote">"Account"</span>)
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorValue(<span class="code-quote">"SAVINGSACCOUNT"</span>)
<span class="code-keyword">public</span> class SavingsAccount <span class="code-keyword">extends</span> Account {
 <span class="code-keyword">private</span> <span class="code-object">double</span> interestRate;
 <span class="code-keyword">private</span> <span class="code-object">double</span> minBalance;
 <span class="code-keyword">private</span> <span class="code-object">double</span> balance;
 <span class="code-keyword">private</span> <span class="code-object">String</span> savingsAccountRules;
	
 <span class="code-keyword">public</span> SavingsAccount(){
  <span class="code-keyword">super</span>();
  <span class="code-keyword">this</span>.interestRate = 0;
  <span class="code-keyword">this</span>.minBalance = 0;
  <span class="code-keyword">this</span>.balance = 0;
  <span class="code-keyword">this</span>.savingsAccountRules = <span class="code-keyword">null</span>;
 }
	
 <span class="code-keyword">public</span> <span class="code-object">double</span> getInterestRate() {
  <span class="code-keyword">return</span> interestRate;
 }
 <span class="code-keyword">public</span> void setInterestRate(<span class="code-object">double</span> interestRate) {
  <span class="code-keyword">this</span>.interestRate = interestRate;
 }
 <span class="code-keyword">public</span> <span class="code-object">double</span> getMinBalance() {
  <span class="code-keyword">return</span> minBalance;
 }
 <span class="code-keyword">public</span> void setMinBalance(<span class="code-object">double</span> minBalance) {
  <span class="code-keyword">this</span>.minBalance = minBalance;
 }
 <span class="code-keyword">public</span> <span class="code-object">double</span> getBalance() {
  <span class="code-keyword">return</span> balance;
 }
 <span class="code-keyword">public</span> void setBalance(<span class="code-object">double</span> balance) {
  <span class="code-keyword">this</span>.balance = balance;
 }
 <span class="code-keyword">public</span> <span class="code-object">String</span> getSavingAccountRules() {
  <span class="code-keyword">return</span> savingsAccountRules;
 }
 <span class="code-keyword">public</span> void setSavingAccountRules(<span class="code-object">String</span> savingAccountRules) {
  <span class="code-keyword">this</span>.savingsAccountRules = savingAccountRules;
 }
}</pre>
</div></div>
<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p><tt>@DiscriminatorValue</tt> annotation provides value that corresponds to the <tt>SavingsAccount</tt> entity for the <tt>DiscriminatorColumn</tt>. The value is <tt>SAVINGSACCOUNT</tt></p></td></tr></table>
<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>CurrentAccount</b></div><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> com.sample.jpa;

<span class="code-keyword">import</span> javax.persistence.DiscriminatorColumn;
<span class="code-keyword">import</span> javax.persistence.DiscriminatorType;
<span class="code-keyword">import</span> javax.persistence.DiscriminatorValue;
<span class="code-keyword">import</span> javax.persistence.Entity;
<span class="code-keyword">import</span> javax.persistence.Inheritance;
<span class="code-keyword">import</span> javax.persistence.InheritanceType;
<span class="code-keyword">import</span> javax.persistence.Table;

@Entity
@Table(name=<span class="code-quote">"Account"</span>)
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorValue(<span class="code-quote">"CURRENTACCOUNT"</span>)
<span class="code-keyword">public</span> class CurrentAccount <span class="code-keyword">extends</span> Account {
 <span class="code-keyword">private</span> <span class="code-object">double</span> interestRate;
 <span class="code-keyword">private</span> <span class="code-object">double</span> minBalance;
 <span class="code-keyword">private</span> <span class="code-object">double</span> balance;
 <span class="code-keyword">private</span> <span class="code-object">String</span> currentAccountRules;
	
 <span class="code-keyword">public</span> CurrentAccount(){
  <span class="code-keyword">super</span>();
  <span class="code-keyword">this</span>.interestRate = 0;
  <span class="code-keyword">this</span>.minBalance = 0;
  <span class="code-keyword">this</span>.balance = 0;
  <span class="code-keyword">this</span>.currentAccountRules = <span class="code-keyword">null</span>;
 }
 <span class="code-keyword">public</span> <span class="code-object">double</span> getInterestRate() {
  <span class="code-keyword">return</span> interestRate;
 }
 <span class="code-keyword">public</span> void setInterestRate(<span class="code-object">double</span> interestRate) {
  <span class="code-keyword">this</span>.interestRate = interestRate;
 }
 <span class="code-keyword">public</span> <span class="code-object">double</span> getMinBalance() {
  <span class="code-keyword">return</span> minBalance;
 }
 <span class="code-keyword">public</span> void setMinBalance(<span class="code-object">double</span> minBalance) {
  <span class="code-keyword">this</span>.minBalance = minBalance;
 }
 <span class="code-keyword">public</span> <span class="code-object">double</span> getBalance() {
  <span class="code-keyword">return</span> balance;
 }
 <span class="code-keyword">public</span> void setBalance(<span class="code-object">double</span> balance) {
  <span class="code-keyword">this</span>.balance = balance;
 }
 <span class="code-keyword">public</span> <span class="code-object">String</span> getCurrentAccountRules() {
  <span class="code-keyword">return</span> currentAccountRules;
 }
 <span class="code-keyword">public</span> void setCurrentAccountRules
          (<span class="code-object">String</span> currentAccountRules) {
  <span class="code-keyword">this</span>.currentAccountRules = currentAccountRules;
 }
}</pre>
</div></div>
<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p><tt>@DiscriminatorValue</tt> annotation provides value that corresponds to the <tt>SavingsAccount</tt> entity for the <tt>DiscriminatorColumn</tt>. The value is <tt>CURRENTACCOUNT</tt>. <br/>
The <tt>CurrentAccount</tt> entity has <tt>currentAccountRules</tt> field and <tt>SavingsAccount</tt> has <tt>SavingsAccountRules</tt> field. Both inherit fields from the parent entity <tt>Account</tt></p></td></tr></table>
<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>AccessAccountStateless</b></div><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> com.sample.jpa;
<span class="code-keyword">import</span> java.util.List;
<span class="code-keyword">public</span> <span class="code-keyword">interface</span> AccessAccountStateless {
 <span class="code-keyword">public</span> SavingsAccount createSavingsAccount
        (<span class="code-object">int</span> accNo, <span class="code-object">String</span> name, 
         <span class="code-object">String</span> address, <span class="code-object">int</span> branchCode,
	 <span class="code-object">double</span> interestRate,
         <span class="code-object">double</span> minBalance,
	 <span class="code-object">double</span> balance, 
         <span class="code-object">String</span> savingsAccountRules);
	
 <span class="code-keyword">public</span> CurrentAccount createCurrentAccount
       (<span class="code-object">int</span> accNo, <span class="code-object">String</span> name,
	<span class="code-object">String</span> address, <span class="code-object">int</span> branchCode,
        <span class="code-object">double</span> interestRate, 
        <span class="code-object">double</span> minBalance,
	<span class="code-object">double</span> balance, 
        <span class="code-object">String</span> currentAccountRules);
 <span class="code-keyword">public</span> List listAccounts();
 <span class="code-keyword">public</span> SavingsAccount 
        updateSavingsAccountBalance
       (<span class="code-object">int</span> accNo, 
        <span class="code-object">double</span> newBalance);
 <span class="code-keyword">public</span> CurrentAccount 
        updateCurrentAccountBalance
       (<span class="code-object">int</span> accNo, 
        <span class="code-object">double</span> newBalance);
 <span class="code-keyword">public</span> void deleteSavingsAccount(<span class="code-object">int</span> accNo);
 <span class="code-keyword">public</span> void deleteCurrentAccount(<span class="code-object">int</span> accNo);
}</pre>
</div></div>
<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>AccessAccountStatelessBean</b></div><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> com.sample.jpa;
<span class="code-keyword">import</span> java.util.ArrayList;
<span class="code-keyword">import</span> java.util.List;
<span class="code-keyword">import</span> javax.ejb.Remote;
<span class="code-keyword">import</span> javax.ejb.Stateless;
<span class="code-keyword">import</span> javax.persistence.EntityManager;
<span class="code-keyword">import</span> javax.persistence.PersistenceContext;
<span class="code-keyword">import</span> javax.persistence.Query;


@Stateless
@Remote
<span class="code-keyword">public</span> class AccessAccountStatelessBean 
             <span class="code-keyword">implements</span> AccessAccountStateless{
 @PersistenceContext(unitName=<span class="code-quote">"SingleTableInheritance"</span>)
  EntityManager em;
	
 <span class="code-keyword">public</span> SavingsAccount createSavingsAccount
       (<span class="code-object">int</span> accNo, <span class="code-object">String</span> name, 
	<span class="code-object">String</span> address, <span class="code-object">int</span> branchCode,
	<span class="code-object">double</span> interestRate, 
        <span class="code-object">double</span> minBalance,
	<span class="code-object">double</span> balance, 
        <span class="code-object">String</span> savingsAccountRules){
		
  SavingsAccount sa = <span class="code-keyword">new</span> SavingsAccount();
  sa.setAccountNo(accNo);
  sa.setAddress(address);
  sa.setBalance(balance);
  sa.setBranchCode(branchCode);
  sa.setMinBalance(minBalance);
  sa.setName(name);
  sa.setSavingAccountRules(savingsAccountRules);
  sa.setInterestRate(interestRate);
  em.persist(sa);
  <span class="code-keyword">return</span> sa;
 }

 <span class="code-keyword">public</span> CurrentAccount createCurrentAccount
       (<span class="code-object">int</span> accNo, <span class="code-object">String</span> name, 
	<span class="code-object">String</span> address, <span class="code-object">int</span> branchCode,
        <span class="code-object">double</span> interestRate, 
        <span class="code-object">double</span> minBalance,
	<span class="code-object">double</span> balance, 
        <span class="code-object">String</span> currentAccountRules){

  CurrentAccount ca = <span class="code-keyword">new</span> CurrentAccount();
  ca.setAccountNo(accNo);
  ca.setAddress(address);
  ca.setBalance(balance);
  ca.setCurrentAccountRules(currentAccountRules);
  ca.setInterestRate(interestRate);
  ca.setMinBalance(minBalance);
  ca.setName(name);
  ca.setBranchCode(branchCode);
  em.persist(ca);
  <span class="code-keyword">return</span> ca;
 }

 <span class="code-keyword">public</span> List listAccounts(){
  List allList = <span class="code-keyword">new</span> ArrayList();
  Query q1 = em.createQuery(<span class="code-quote">"SELECT sa FROM SavingsAccount sa"</span>);
  List currList1 = q1.getResultList();
  allList.addAll(currList1);
  Query q2 = em.createQuery(<span class="code-quote">"SELECT ca FROM CurrentAccount ca"</span>);
  List currList2 = q2.getResultList();
  allList.addAll(currList2);
  <span class="code-keyword">return</span> allList;
 }

 <span class="code-keyword">public</span> SavingsAccount updateSavingsAccountBalance
         (<span class="code-object">int</span> accNo, <span class="code-object">double</span> newBalance){
  SavingsAccount sa = 
   em.find(SavingsAccount.class, accNo);
  <span class="code-keyword">if</span> (sa == <span class="code-keyword">null</span>) 
     <span class="code-keyword">throw</span> <span class="code-keyword">new</span> IllegalStateException
          (<span class="code-quote">"Account number not found"</span>);
  Query q = em.createQuery
       ("UPDATE SavingsAccount sa SET 
         sa.balance = "+newBalance);
  q.executeUpdate();
  <span class="code-keyword">return</span> sa;
	
 }
 <span class="code-keyword">public</span> CurrentAccount updateCurrentAccountBalance
                      (<span class="code-object">int</span> accNo, <span class="code-object">double</span> newBalance){
  CurrentAccount ca = em.find(CurrentAccount.class, accNo);
  <span class="code-keyword">if</span> (ca == <span class="code-keyword">null</span>) <span class="code-keyword">throw</span> <span class="code-keyword">new</span> IllegalStateException
                 (<span class="code-quote">"Account number not found"</span>);
  Query q = em.createQuery("UPDATE CurrentAccount 
                        ca SET ca.balance = "+newBalance);
  q.executeUpdate();
  <span class="code-keyword">return</span> ca;
 }

 <span class="code-keyword">public</span> void deleteSavingsAccount(<span class="code-object">int</span> accNo){
  SavingsAccount sa = 
   em.find(SavingsAccount.class, accNo);
  <span class="code-keyword">if</span>(sa == <span class="code-keyword">null</span>) 
     <span class="code-keyword">throw</span> <span class="code-keyword">new</span> 
      IllegalStateException(<span class="code-quote">"Account number not found"</span>);
  em.remove(sa);
 }
 <span class="code-keyword">public</span> void deleteCurrentAccount(<span class="code-object">int</span> accNo){
  CurrentAccount ca = 
   em.find(CurrentAccount.class, accNo);
  <span class="code-keyword">if</span>(ca == <span class="code-keyword">null</span>) 
   <span class="code-keyword">throw</span> <span class="code-keyword">new</span> IllegalStateException
    (<span class="code-quote">"Account number not found"</span>);
  em.remove(ca);
 }
}</pre>
</div></div>
<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>com.sample.jpa.Test</b></div><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> com.sample.jpa;
<span class="code-keyword">import</span> java.io.IOException;
<span class="code-keyword">import</span> java.io.PrintWriter;
<span class="code-keyword">import</span> java.util.List;
<span class="code-keyword">import</span> javax.ejb.EJB;
<span class="code-keyword">import</span> javax.servlet.ServletException;
<span class="code-keyword">import</span> javax.servlet.http.HttpServletRequest;
<span class="code-keyword">import</span> javax.servlet.http.HttpServletResponse;

<span class="code-keyword">public</span> class Test <span class="code-keyword">extends</span> 
 javax.servlet.http.HttpServlet 
 <span class="code-keyword">implements</span> javax.servlet.Servlet {

 <span class="code-keyword">static</span> <span class="code-keyword">final</span> <span class="code-object">long</span> serialVersionUID = 1L;
 @EJB AccessAccountStateless aas;

 <span class="code-keyword">public</span> Test() {
  <span class="code-keyword">super</span>();
 }   	
 <span class="code-keyword">protected</span> void doGet(HttpServletRequest request, 
                      HttpServletResponse response) 
                      <span class="code-keyword">throws</span> ServletException, 
                      IOException {
  PrintWriter out = response.getWriter();
  <span class="code-object">int</span> accNo = <span class="code-object">Integer</span>.parseInt(request.getParameter(<span class="code-quote">"accNo"</span>));
  <span class="code-object">String</span> name = request.getParameter(<span class="code-quote">"name"</span>);

  aas.createCurrentAccount(accNo, name, 
      name+<span class="code-quote">"' address"</span>, 10, 20, 200, 5000, 
      <span class="code-quote">"Current Account!!"</span>);

  aas.createSavingsAccount(accNo+1, name, 
      name+<span class="code-quote">"' address"</span>,	12, 234, 4534, 13323, 
      <span class="code-quote">"Savings Account!!"</span>);

  out.println("Created a Savings account 
               and a Current Account");
  List accList = aas.listAccounts();
  out.println(<span class="code-quote">"&lt;table&gt;"</span>);
  out.println(<span class="code-quote">"&lt;tr&gt;"</span>);
  out.println(<span class="code-quote">"&lt;th&gt;AccountNumber&lt;/th&gt;"</span>);
  out.println(<span class="code-quote">"&lt;th&gt;Name&lt;/th&gt;"</span>);
  out.println(<span class="code-quote">"&lt;th&gt;Address&lt;/th&gt;"</span>);
  out.println(<span class="code-quote">"&lt;th&gt;Branch Code&lt;/th&gt;"</span>);
  out.println(<span class="code-quote">"&lt;th&gt;Interest Rate&lt;/th&gt;"</span>);
  out.println(<span class="code-quote">"&lt;th&gt;Minimum Balance&lt;/th&gt;"</span>);
  out.println(<span class="code-quote">"&lt;th&gt;Balance&lt;/th&gt;"</span>);
  out.println(<span class="code-quote">"&lt;th&gt;Current Account Rules&lt;/th&gt;"</span>);
  out.println(<span class="code-quote">"&lt;th&gt;Savings Account Rules&lt;/th&gt;"</span>);
  out.println(<span class="code-quote">"&lt;/tr&gt;"</span>);

  <span class="code-keyword">for</span>(<span class="code-object">int</span> i = 0; i &lt; accList.size(); i++){
   Account a = (Account)accList.get(i);
   <span class="code-keyword">if</span> (a <span class="code-keyword">instanceof</span> SavingsAccount){
    SavingsAccount sa = (SavingsAccount)a;
    out.println(<span class="code-quote">"&lt;tr&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;"</span>+sa.getAccountNo()+<span class="code-quote">"&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;"</span>+sa.getName()+<span class="code-quote">"&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;"</span>+sa.getAddress()+<span class="code-quote">"&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;"</span>+sa.getBranchCode()+<span class="code-quote">"&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;"</span>+sa.getInterestRate()+<span class="code-quote">"&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;"</span>+sa.getMinBalance()+<span class="code-quote">"&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;"</span>+sa.getBalance()+<span class="code-quote">"&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;"</span>+sa.getSavingAccountRules()+<span class="code-quote">"&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;/tr&gt;"</span>);
   }<span class="code-keyword">else</span> <span class="code-keyword">if</span> (a <span class="code-keyword">instanceof</span> CurrentAccount){
    CurrentAccount ca = (CurrentAccount)a;
    out.println(<span class="code-quote">"&lt;tr&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;"</span>+ca.getAccountNo()+<span class="code-quote">"&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;"</span>+ca.getName()+<span class="code-quote">"&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;"</span>+ca.getAddress()+<span class="code-quote">"&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;"</span>+ca.getBranchCode()+<span class="code-quote">"&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;"</span>+ca.getInterestRate()+<span class="code-quote">"&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;"</span>+ca.getMinBalance()+<span class="code-quote">"&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;"</span>+ca.getBalance()+<span class="code-quote">"&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;"</span>+ca.getCurrentAccountRules()+<span class="code-quote">"&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;td&gt;&lt;/td&gt;"</span>);
    out.println(<span class="code-quote">"&lt;/tr&gt;"</span>);
   }
  }
  out.println(<span class="code-quote">"&lt;/table&gt;"</span>);
  out.println(<span class="code-quote">"Deleting both the accounts "</span>+accNo+<span class="code-quote">" and "</span>+(accNo+1));
  <span class="code-comment">//aas.deleteCurrentAccount(accNo);
</span>  <span class="code-comment">//aas.deleteSavingsAccount(accNo+1);
</span>  <span class="code-comment">//out.println(<span class="code-quote">"Accounts successfully deleted..!!"</span>);
</span> }  	

 <span class="code-keyword">protected</span> void doPost(HttpServletRequest request, 
                       HttpServletResponse response) 
                       <span class="code-keyword">throws</span> ServletException, 
                              IOException {
 }  
}</pre>
</div></div>
<p>The above servlet client only inserts entities in the table <tt>ACCOUNT</tt>. The code that deletes entities is commented out. We can write variety of clients that lookup the EJB and perform operations on the entities.</p>
<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>Persistence.xml</b></div><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;?xml version=<span class="code-quote">"1.0"</span> encoding=<span class="code-quote">"UTF-8"</span>?&gt;</span>
&lt;persistence 
 xmlns=<span class="code-quote">"http://java.sun.com/xml/ns/persistence"</span>
 <span class="code-keyword">xmlns:xsi</span>=<span class="code-quote">"http://www.w3.org/2001/XMLSchema-instance"</span> 
 version=<span class="code-quote">"1.0"</span>
 xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"&gt;
 
 <span class="code-tag">&lt;persistence-unit name=<span class="code-quote">"SingleTableInheritance"</span>&gt;</span>
 <span class="code-tag">&lt;description&gt;</span>
   Single Table Inheritance example
 <span class="code-tag">&lt;/description&gt;</span>
 <span class="code-tag">&lt;provider&gt;</span>
  org.apache.openjpa.persistence.PersistenceProviderImpl
 <span class="code-tag">&lt;/provider&gt;</span>
 <span class="code-tag">&lt;class&gt;</span>com.sample.jpa.Account<span class="code-tag">&lt;/class&gt;</span>
 <span class="code-tag">&lt;class&gt;</span>com.sample.jpa.SavingsAccount<span class="code-tag">&lt;/class&gt;</span>
 <span class="code-tag">&lt;class&gt;</span>com.sample.jpa.CurrentAccount<span class="code-tag">&lt;/class&gt;</span>
 <span class="code-tag">&lt;properties&gt;</span>
  &lt;property 
   name=<span class="code-quote">"openjpa.ConnectionURL"</span> 
   value=<span class="code-quote">"jdbc:derby:AccountDB"</span> /&gt;
  &lt;property 
   name=<span class="code-quote">"openjpa.ConnectionDriverName"</span> 
   value=<span class="code-quote">"org.apache.derby.jdbc.EmbeddedDriver"</span> /&gt;
   <span class="code-tag">&lt;property name=<span class="code-quote">"ConnectionUserName"</span> value=<span class="code-quote">"app"</span> /&gt;</span>
   &lt;property name=<span class="code-quote">"openjpa.jdbc.SynchronizeMappings"</span> 
    value=<span class="code-quote">"false"</span> /&gt;
  <span class="code-tag">&lt;/properties&gt;</span>
 <span class="code-tag">&lt;/persistence-unit&gt;</span>
 &lt;!--
 <span class="code-tag">&lt;jta-data-source&gt;</span>PhoneBookPool<span class="code-tag">&lt;/jta-data-source&gt;</span>
 <span class="code-tag">&lt;non-jta-data-source&gt;</span>PhoneBookPool<span class="code-tag">&lt;/non-jta-data-source&gt;</span>
 --&gt;
<span class="code-tag">&lt;/persistence&gt;</span></pre>
</div></div>
<p>The persistence schema uses <tt>AccountDB</tt> derby database. It declares the entities in the persistence unit as well. The following procedure explains how to deploy/run the sample.</p>

<ul>
	<li>Create an EAR application that contains an EJB application packaging all entity classes, ejb classes and META-INF/persistence.xml</li>
	<li>Create META-INF/ejb-jar.xml. Since we have used annotations, we do not have to provide any declarations in it.</li>
	<li>Create a WEB application in the EAR and add the above servlet.</li>
	<li>Create a derby database by name <tt>AccountDB</tt> using admin console.</li>
	<li>Create a table by name <tt>ACCOUNT</tt> as following.
<div class="code" style="border-style: solid; "><div class="codeHeader" style="border-bottom-style: solid; "><b>ACCOUNT table</b></div><div class="codeContent">
<pre class="code-sql">create table ACCOUNT(ACCOUNTNO integer, 
             ACCOUNTTYPE varchar(50), 
             NAME varchar(50), 
             ADDRESS varchar(225),
             BRANCHCODE integer, 
             INTERESTRATE decimal(15,2), 
             MINBALANCE decimal(15,2), 
             BALANCE decimal(15,2), 
             CURRENTACCOUNTRULES varchar(225), 
             SAVINGSACCOUNTRULES varchar(225))</pre>
</div></div></li>
</ul>


<ul>
	<li>Run the servlet with the following input<br/>
  <tt><span class="nobr"><a href="http://localhost:8080/" title="Visit page outside Confluence" rel="nofollow">http://localhost:8080/<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>&lt;web-context&gt;/Test?accNo=1&amp;name=Joe</tt><br/>
  <tt><span class="nobr"><a href="http://localhost:8080/" title="Visit page outside Confluence" rel="nofollow">http://localhost:8080/<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>&lt;web-context&gt;/Test?accNo=3&amp;name=John</tt></li>
</ul>


<ul>
	<li>The following data will be inserted into <tt>ACCOUNT</tt> table.
<div class="preformatted" style="border-style: solid; "><div class="preformattedHeader" style="border-bottom-style: solid; "><b>ACCOUNT table</b></div><div class="preformattedContent">
<pre>ACCOUNTNO ACCOUNTTYPE NAME ADDRESS BRANCHCODE INTERESTRATE MINBALANCE BALANCE CURRENTACCOUNTRULES SAVINGSACCOUNTRULES 
1 CURRENTACCOUNT Joe Joe's address 10 20.00 200.00 5000.00 Current Account!!  
2 SAVINGSACCOUNT Joe Joe's address 12 234.00 4534.00 13323.00  Savings Account!! 
3 CURRENTACCOUNT John John's address 10 20.00 200.00 5000.00 Current Account!!  
4 SAVINGSACCOUNT John John's address 12 234.00 4534.00 13323.00  Savings Account!!
</pre>
</div></div></li>
</ul>


<p>Note that JPA has inserted the value <tt>CURRENTACCOUNT</tt> in the column <tt>ACCOUNTTYPE</tt> for CurrentAccount entities and inserted the value <tt>SAVINGSACCOUNT</tt> for SavingsAccount entites.</p></div>


</td></tr></table></div>
<p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tr>
        <td height="12" background="http://cwiki.apache.org/confluence/images/border/border_bottom.gif"><img src="http://cwiki.apache.org/confluence/images/border/spacer.gif" width="1" height="1" border="0"/></td>
    </tr>
</table>

<div class="smalltext">
    Powered by
    <a href="http://www.atlassian.com/software/confluence/default.jsp?clicked=footer" class="smalltext">Atlassian Confluence</a>
    (Version: 2.2.9 Build:#527 Sep 07, 2006)
    -
    <a href="http://jira.atlassian.com/secure/BrowseProject.jspa?id=10470" class="smalltext">Bug/feature request</a><br/>
    <br>
    <a href="http://cwiki.apache.org/confluence/users/viewnotifications.action">Unsubscribe or edit your notifications preferences</a>

</div>

</body>
</html>


Mime
View raw message