My Scala Base

Adventures in Scala

Just worked through Hibernate's tutorial, but using Scala. Googling for hints turned up info from Matt Hellige's blog(s) and Viktor Klang from the lift web group. So with a tip of the hat to them, here's a working example of using Hibernate from Scala, in a single file. Enjoy...


package scalanate
import scala.xml._ import java.util.Date import org.hibernate._ import org.hibernate.cfg._  class Event {   var id: Long = 0L    var title: String = null   var date: Date = null    var participants: java.util.Set = new java.util.HashSet      override def toString = "Event " + id + " " + title + " " + date }  class Person {   var id: Long = 0L    var age: Int = 0   var name: String = null     var events: java.util.Set = new java.util.HashSet    override def toString = "Person " + id + " " + name + " " + age }  object Main {    def main(args: Array[String]) {     println("main: " + args.mkString(","));          args(0) match {       case "test0" => test0       case "test1" => test1       case "test2" => test2     }   }    def test0 =      withTxSession(session => {       val e1 = new Event       e1.title = "hi"       e1.date = new Date       session.save(e1)     })        def test1 = {     withTxSession(session => {       val e1 = new Event       e1.title = "hi"       e1.date = new Date       session.save(e1)       val e2 = new Event       e2.title = "bye"       e2.date = new Date       session.save(e2)       val eIter = session.createQuery("from Event").list.iterator       while (eIter.hasNext) {         val e = eIter.next.asInstanceOf[Event]         println(e)       }     })   }      def test2 = {     withTxSession(session => {       val e1 = new Event       e1.title = "hi"       e1.date = new Date       session.save(e1)       val e2 = new Event       e2.title = "bye"       e2.date = new Date       session.save(e2)       val p1 = new Person       p1.name = "p1"       p1.age = 21       session.save(p1)     })          println("test2.a")      withTxSession(session => {       val p1 = session.createQuery("from Person").list.get(0).asInstanceOf[Person]       println(p1)              val eIter = session.createQuery("from Event").list.iterator       while (eIter.hasNext) {         val e = eIter.next.asInstanceOf[Event]         p1.events.add(e)         e.participants.add(p1)       }     })      println("test2.b")      withTxSession(session => {       val p1 = session.createQuery("from Person").list.get(0).asInstanceOf[Person]       println(p1)       println(p1.events)       val eIter = p1.events.iterator       while (eIter.hasNext) {         val e = eIter.next.asInstanceOf[Event]         println(e)         println(e.participants)       }     })      println("test2.c")   }      def withTxSession(f: (Session) => Any) = {     val s = sessionFactory.getCurrentSession     val t = s.beginTransaction     val r = f(s)     t.commit     r   }    // ---------------------------------    lazy val sessionFactory = configuration.buildSessionFactory   lazy val configuration  = (new Configuration).configure(configDoc).addDocument(mappingDoc)      // ---------------------------------    def mappingDoc = parseDoc(mappingXML)   def mappingXML =      <hibernate-mapping default-access="field">       <class name="scalanate.Event" table="EVENTS">           <id name="id" column="EVENT_ID">               <generator class="native"/>           </id>           <property name="date" type="timestamp" column="EVENT_DATE"/>           <property name="title"/>           <set name="participants" table="PERSON_EVENT" inverse="true">               <key column="EVENT_ID"/>               <many-to-many column="PERSON_ID" class="scalanate.Person"/>           </set>       </class>       <class name="scalanate.Person" table="PERSON">           <id name="id" column="PERSON_ID">               <generator class="native"/>           </id>           <property name="age"/>           <property name="name"/>           <set name="events" table="PERSON_EVENT">               <key column="PERSON_ID"/>               <many-to-many column="EVENT_ID" class="scalanate.Event"/>           </set>                 </class>     </hibernate-mapping>            def configDoc = parseDoc(configXML)   def configXML =     <hibernate-configuration>             <session-factory>             <!-- Database connection settings -->             <property name="connection.driver_class">org.h2.Driver</property>             <property name="connection.url">jdbc:h2:mem:test_mem</property>             <property name="connection.username">admin</property>             <property name="connection.password"></property>                 <property name="dialect">org.hibernate.dialect.H2Dialect</property>              <property name="current_session_context_class">thread</property>              <!-- Emit generated sql for debugging -->             <property name="show_sql">true</property>              <!-- Auto-drop/recreate schema on startup -->             <property name="hbm2ddl.auto">create</property>          </session-factory>         </hibernate-configuration>          // ---------------------------------    lazy val parseDocFactory = javax.xml.parsers.DocumentBuilderFactory.newInstance    def parseDoc(x: Node) = {     import org.xml.sax.InputSource     import java.io.StringReader      parseDocFactory.newDocumentBuilder.parse(new InputSource(new StringReader(x.toString)))   } }
A large chunk of the code is just the test1/2/3 methods which exercise the Hibernate API, per the tutorial. And, you can see I couldn't resist using Scala's inline XML feature.

(Scala experts: if anyone has a better way of turning a Scala Node/Elem into a real org.w3c.dom.Document so I can pass it into Hibernate, I would love to know how!)

If you save the above as test.scala, then you can compile and run it with
scalac test.scala
java scalanate.Main [test0|test1|test2] 
By the way, I had to add all these jars to my classpath to get it to work. Sheesh.
set CLASSPATH=%CLASSPATH%;lib\scala-library.jar
set CLASSPATH=%CLASSPATH%;lib\antlr-2.7.6.jar set CLASSPATH=%CLASSPATH%;lib\antlr-2.7.6.jar set CLASSPATH=%CLASSPATH%;lib\asm.jar set CLASSPATH=%CLASSPATH%;lib\asm-attrs.jar set CLASSPATH=%CLASSPATH%;lib\cglib-2.1.3.jar set CLASSPATH=%CLASSPATH%;lib\commons-collections-2.1.1.jar set CLASSPATH=%CLASSPATH%;lib\commons-logging-1.0.4.jar set CLASSPATH=%CLASSPATH%;lib\dom4j-1.6.1.jar set CLASSPATH=%CLASSPATH%;lib\jaxen-1.1-beta-7.jar set CLASSPATH=%CLASSPATH%;lib\log4j-1.2.11.jar set CLASSPATH=%CLASSPATH%;lib\jta.jar set CLASSPATH=%CLASSPATH%;lib\h2.jar set CLASSPATH=%CLASSPATH%;lib\hibernate3.jar 

Share 

Add a Comment

You need to be a member of My Scala Base to add comments!

Join this Ning Network

About

Steve Yen Steve Yen created this Ning Network.

© 2009   Created by Steve Yen on Ning.   Create a Ning Network!

Badges  |  Report an Issue  |  Privacy  |  Terms of Service