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.By the way, I had to add all these jars to my classpath to get it to work. Sheesh.scalac test.scala java scalanate.Main [test0|test1|test2]
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
Tags:
© 2009 Created by Steve Yen on Ning. Create a Ning Network!
You need to be a member of My Scala Base to add comments!
Join this Ning Network