#LyX 1.6.1 created this file. For more info see http://www.lyx.org/
\lyxformat 345
\begin_document
\begin_header
\textclass book
\use_default_options false
\language english
\inputencoding auto
\font_roman default
\font_sans default
\font_typewriter default
\font_default_family default
\font_sc false
\font_osf false
\font_sf_scale 100
\font_tt_scale 100
\graphics default
\paperfontsize default
\spacing single
\use_hyperref false
\papersize default
\use_geometry false
\use_amsmath 1
\use_esint 1
\cite_engine basic
\use_bibtopic false
\paperorientation portrait
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\defskip medskip
\quotes_language english
\papercolumns 1
\papersides 1
\paperpagestyle default
\tracking_changes false
\output_changes false
\author ""
\author ""
\end_header
\begin_body
\begin_layout Chapter
JPA Code Listings
\begin_inset CommandInset label
LatexCommand label
name "cha:Code-Listings"
\end_inset
\end_layout
\begin_layout Standard
To conserve space and preserve flow in the main text, we've placed full
code listings for the JPA chapter in this appendix.
\end_layout
\begin_layout Section
JPA Library Demo
\end_layout
\begin_layout Standard
The full library demo is available under the main Lift Git repository at
\begin_inset Flex URL
status collapsed
\begin_layout Plain Layout
http://github.com/dpp/liftweb/tree/master
\end_layout
\end_inset
.
To illustrate some points, we've included selected listings from the project.
\end_layout
\begin_layout Standard
\begin_inset Newpage clearpage
\end_inset
\end_layout
\begin_layout Subsection
Author Entity
\end_layout
\begin_layout Standard
\begin_inset listings
lstparams "numbers=left,numberstyle={\tiny},stepnumber=2"
inline false
status open
\begin_layout Plain Layout
\begin_inset Caption
\begin_layout Plain Layout
\begin_inset CommandInset label
LatexCommand label
name "lst:Author.scala"
\end_inset
Author.scala
\end_layout
\end_inset
\end_layout
\begin_layout Plain Layout
package com.foo.jpaweb.model
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
import javax.persistence._
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
/**
\end_layout
\begin_layout Plain Layout
An author is someone who writes books.
\end_layout
\begin_layout Plain Layout
*/
\end_layout
\begin_layout Plain Layout
@Entity
\end_layout
\begin_layout Plain Layout
class Author {
\end_layout
\begin_layout Plain Layout
@Id
\end_layout
\begin_layout Plain Layout
@GeneratedValue(){val strategy = GenerationType.AUTO}
\end_layout
\begin_layout Plain Layout
var id : Long = _
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
@Column{val unique = true, val nullable = false}
\end_layout
\begin_layout Plain Layout
var name : String = ""
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
@OneToMany(){val mappedBy = "author", val targetEntity = classOf[Book],
\end_layout
\begin_layout Plain Layout
val cascade = Array(CascadeType.REMOVE)}
\end_layout
\begin_layout Plain Layout
var books : java.util.Set[Book] = new java.util.HashSet[Book]()
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
\end_layout
\end_inset
\end_layout
\begin_layout Standard
\begin_inset Newpage clearpage
\end_inset
\end_layout
\begin_layout Subsection
orm.xml
\begin_inset Index
status collapsed
\begin_layout Plain Layout
orm.xml
\end_layout
\end_inset
Mapping
\end_layout
\begin_layout Standard
\begin_inset listings
lstparams "basicstyle={\scriptsize},breaklines=true,language=XML,numbers=left,numberstyle={\tiny}"
inline false
status collapsed
\begin_layout Plain Layout
\begin_inset Caption
\begin_layout Plain Layout
\begin_inset CommandInset label
LatexCommand label
name "lst:orm.xml"
\end_inset
orm.xml
\end_layout
\end_inset
<?xml version="1.0" encoding="UTF-8" ?>
\end_layout
\begin_layout Plain Layout
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
\end_layout
\begin_layout Plain Layout
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
\end_layout
\begin_layout Plain Layout
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm
\end_layout
\begin_layout Plain Layout
http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" version="1.0">
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
<package>com.foo.jpaweb.model</package>
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
<entity class="Book">
\end_layout
\begin_layout Plain Layout
<named-query name="findBooksByAuthor">
\end_layout
\begin_layout Plain Layout
<query><![CDATA[from Book b where b.author.id = :id order by b.title]]></quer
y>
\end_layout
\begin_layout Plain Layout
</named-query>
\end_layout
\begin_layout Plain Layout
<named-query name="findBooksByDate">
\end_layout
\begin_layout Plain Layout
<query><![CDATA[from Book b where b.published between :startDate and
:endDate]]></query>
\end_layout
\begin_layout Plain Layout
</named-query>
\end_layout
\begin_layout Plain Layout
<named-query name="findBooksByTitle">
\end_layout
\begin_layout Plain Layout
<query><![CDATA[from Book b where lower(b.title) like :title order
by b.title]]></query>
\end_layout
\begin_layout Plain Layout
</named-query>
\end_layout
\begin_layout Plain Layout
<named-query name="findAllBooks">
\end_layout
\begin_layout Plain Layout
<query><![CDATA[from Book b order by b.title]]></query>
\end_layout
\begin_layout Plain Layout
</named-query>
\end_layout
\begin_layout Plain Layout
</entity>
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
<entity class="Author">
\end_layout
\begin_layout Plain Layout
<named-query name="findAllAuthors">
\end_layout
\begin_layout Plain Layout
<query><![CDATA[from Author a order by a.name]]></query>
\end_layout
\begin_layout Plain Layout
</named-query>
\end_layout
\begin_layout Plain Layout
</entity>
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
</entity-mappings>
\end_layout
\end_inset
\end_layout
\begin_layout Standard
\begin_inset Newpage clearpage
\end_inset
\end_layout
\begin_layout Subsection
Enumv Trait
\end_layout
\begin_layout Standard
\begin_inset listings
lstparams "basicstyle={\scriptsize},breaklines=true,firstline=5,numbers=left,numberstyle={\tiny}"
inline false
status collapsed
\begin_layout Plain Layout
\begin_inset Caption
\begin_layout Plain Layout
\begin_inset CommandInset label
LatexCommand label
name "lst:Enumv-Trait"
\end_inset
Enumv Trait
\end_layout
\end_inset
package com.foo.jpaweb.model
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
/* adds a valueOf function, assumes name is defined
\end_layout
\begin_layout Plain Layout
add optional description */
\end_layout
\begin_layout Plain Layout
trait Enumv {
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
this: Enumeration =>
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
private var nameDescriptionMap = scala.collection.mutable.Map[String, String]()
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
/* store a name and description for forms */
\end_layout
\begin_layout Plain Layout
def Value(name: String, desc: String) : Value = {
\end_layout
\begin_layout Plain Layout
nameDescriptionMap += (name -> desc)
\end_layout
\begin_layout Plain Layout
new Val(name)
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
/* get description if it exists else name */
\end_layout
\begin_layout Plain Layout
def getDescriptionOrName(ev: this.Value) = {
\end_layout
\begin_layout Plain Layout
try {
\end_layout
\begin_layout Plain Layout
nameDescriptionMap(""+ev)
\end_layout
\begin_layout Plain Layout
} catch {
\end_layout
\begin_layout Plain Layout
case e: NoSuchElementException => ev.toString
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
/* get name description pair list for forms */
\end_layout
\begin_layout Plain Layout
def getNameDescriptionList = this.elements.toList.map(v => (v.toString, getDescri
ptionOrName(v) ) ).toList
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
/* get the enum given a string */
\end_layout
\begin_layout Plain Layout
def valueOf(str: String) = this.elements.toList.filter(_.toString == str)
match {
\end_layout
\begin_layout Plain Layout
case Nil => null
\end_layout
\begin_layout Plain Layout
case x => x.head
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
}
\end_layout
\end_inset
\end_layout
\begin_layout Standard
\begin_inset Newpage clearpage
\end_inset
\end_layout
\begin_layout Subsection
EnumerationType
\end_layout
\begin_layout Standard
\begin_inset listings
lstparams "basicstyle={\scriptsize},breaklines=true,firstline=15,lastline=35,numbers=left,numberstyle={\tiny}"
inline false
status collapsed
\begin_layout Plain Layout
\begin_inset Caption
\begin_layout Plain Layout
\begin_inset CommandInset label
LatexCommand label
name "lst:EnumvType"
\end_inset
EnumvType class
\end_layout
\end_inset
package com.foo.jpaweb.model
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
import java.io.Serializable
\end_layout
\begin_layout Plain Layout
import java.sql.PreparedStatement
\end_layout
\begin_layout Plain Layout
import java.sql.ResultSet
\end_layout
\begin_layout Plain Layout
import java.sql.SQLException
\end_layout
\begin_layout Plain Layout
import java.sql.Types
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
import org.hibernate.HibernateException
\end_layout
\begin_layout Plain Layout
import org.hibernate.usertype.UserType
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
/**
\end_layout
\begin_layout Plain Layout
* Helper class to translate enum for hibernate
\end_layout
\begin_layout Plain Layout
*/
\end_layout
\begin_layout Plain Layout
abstract class EnumvType(val et: Enumeration with Enumv) extends UserType
{
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
val SQL_TYPES = Array({Types.VARCHAR})
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
override def sqlTypes() = SQL_TYPES
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
override def returnedClass = classOf[et.Value]
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
override def equals(x: Object, y: Object): Boolean = {
\end_layout
\begin_layout Plain Layout
return x == y
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
override def hashCode(x: Object) = x.hashCode
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
override def nullSafeGet(resultSet: ResultSet, names: Array[String], owner:
Object): Object = {
\end_layout
\begin_layout Plain Layout
val value = resultSet.getString(names(0))
\end_layout
\begin_layout Plain Layout
if (resultSet.wasNull()) return null
\end_layout
\begin_layout Plain Layout
else {
\end_layout
\begin_layout Plain Layout
return et.valueOf(value)
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
override def nullSafeSet(statement: PreparedStatement, value: Object,
index: Int): Unit = {
\end_layout
\begin_layout Plain Layout
if (value == null) {
\end_layout
\begin_layout Plain Layout
statement.setNull(index, Types.VARCHAR)
\end_layout
\begin_layout Plain Layout
} else {
\end_layout
\begin_layout Plain Layout
val en = value.toString
\end_layout
\begin_layout Plain Layout
statement.setString(index, en)
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
}
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
override def deepCopy(value: Object): Object = value
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
override def isMutable() = false
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
override def disassemble(value: Object) = value.asInstanceOf[Serializable]
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
override def assemble(cached: Serializable, owner: Object): Serializable
= cached
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
override def replace(original: Object, target: Object, owner: Object)
= original
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
}
\end_layout
\end_inset
\end_layout
\begin_layout Standard
\begin_inset Newpage clearpage
\end_inset
\end_layout
\begin_layout Subsection
JPA web.xml
\begin_inset Index
status collapsed
\begin_layout Plain Layout
web.xml
\end_layout
\end_inset
\end_layout
\begin_layout Standard
This shows the LiftFilter setup as well as the persistence-context-ref.
\end_layout
\begin_layout Standard
\begin_inset listings
inline false
status open
\begin_layout Plain Layout
\begin_inset Caption
\begin_layout Plain Layout
\begin_inset CommandInset label
LatexCommand label
name "lst:JPA-web.xml"
\end_inset
JPA web.xml
\end_layout
\end_inset
\end_layout
\begin_layout Plain Layout
<?xml version="1.0" encoding="ISO-8859-1"?>
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
<!DOCTYPE web-app
\end_layout
\begin_layout Plain Layout
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
\end_layout
\begin_layout Plain Layout
"http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
<web-app>
\end_layout
\begin_layout Plain Layout
<filter>
\end_layout
\begin_layout Plain Layout
<filter-name>LiftFilter</filter-name>
\end_layout
\begin_layout Plain Layout
<display-name>Lift Filter</display-name>
\end_layout
\begin_layout Plain Layout
<description>The Filter that intercepts lift calls</description>
\end_layout
\begin_layout Plain Layout
<filter-class>net.liftweb.http.LiftFilter</filter-class>
\end_layout
\begin_layout Plain Layout
<persistence-context-ref>
\end_layout
\begin_layout Plain Layout
<description>
\end_layout
\begin_layout Plain Layout
Persistence context for the library app
\end_layout
\begin_layout Plain Layout
</description>
\end_layout
\begin_layout Plain Layout
<persistence-context-ref-name>
\end_layout
\begin_layout Plain Layout
persistence/jpaweb
\end_layout
\begin_layout Plain Layout
</persistence-context-ref-name>
\end_layout
\begin_layout Plain Layout
<persistence-unit-name>
\end_layout
\begin_layout Plain Layout
jpaweb
\end_layout
\begin_layout Plain Layout
</persistence-unit-name>
\end_layout
\begin_layout Plain Layout
</persistence-context-ref>
\end_layout
\begin_layout Plain Layout
</filter>
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
<filter-mapping>
\end_layout
\begin_layout Plain Layout
<filter-name>LiftFilter</filter-name>
\end_layout
\begin_layout Plain Layout
<url-pattern>/*</url-pattern>
\end_layout
\begin_layout Plain Layout
</filter-mapping>
\end_layout
\begin_layout Plain Layout
\end_layout
\begin_layout Plain Layout
</web-app>
\end_layout
\begin_layout Plain Layout
\end_layout
\end_inset
\end_layout
\end_body
\end_document