#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 \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout com.foo.jpaweb.model \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \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 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 \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout LiftFilter \end_layout \begin_layout Plain Layout Lift Filter \end_layout \begin_layout Plain Layout The Filter that intercepts lift calls \end_layout \begin_layout Plain Layout net.liftweb.http.LiftFilter \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout Persistence context for the library app \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout persistence/jpaweb \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout jpaweb \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout LiftFilter \end_layout \begin_layout Plain Layout /* \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \begin_layout Plain Layout \end_layout \end_inset \end_layout \end_body \end_document