Hibernate和Scala

我一直在玩Scala,我想知道是否有任何经验使用hibernate和mysql作为scala对象的持久存储? 它是开箱即用还是有很多事情要做?

大多数时候,Scala + Hibernate工作得很好,轻微的颠簸很容易被克服。 例如,在处理集合时,Hibernate需要使用java.util接口。 但是如果您想要使用Scala更强大的库,则可以导入scala.collection.jcl.Conversions._。

你可能想看看弗兰克·索莫斯的post了解更多信息。

这绝对不是很多工作。 一个简单的hibernate + scala示例可以在几十行中定义。 Scala和Java可以在同一个项目中混合使用。 特别是,hibernate-scala组合使得JPA框架和一个非常灵活的orm层可以与scala提供的不可变结构和函数式编程结合起来成为可能。

实验hibernate和scala最简单的方法是通过hibernate / jpa使用内存中的hsqldb数据库。 首先,我们来定义领域模型。 在这种情况下,一个按照hibernate风格注解的scala类,关于我的哥们。

 package nl.busa.jpa import javax.persistence._ @Entity @Table(name = "buddy") class Buddy(first: String, last: String) { @Id @GeneratedValue(strategy = GenerationType.AUTO) var id: Int = _ var firstName: String = first var lastName: String = last def this() = this (null, null) override def toString = id + " = " + firstName + " " + lastName } 

注意scala类比java类更加紧凑,因为我们不需要典型的getter / setter样板代码。 现在让我们确保jpa模块和数据库模型被加载。 根据hibernate规范,我们添加众所周知的hibernateconfiguration文件:resources / META-INF / persistence.xml:

 <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="nl.busa.jpa.HibernateJpaScalaTutorial"> <description> Persistence unit for the JPA tutorial of the Hibernate Getting Started Guide </description> <class>nl.busa.jpa.HibernateJpaScalaTutorial</class> <properties> <property name="javax.persistence.jdbc.driver" value="org.hsqldb.jdbcDriver"/> <property name="javax.persistence.jdbc.url" value="jdbc:hsqldb:mem:JpaScala"/> <property name="hibernate.show_sql" value="false"/> <property name="hibernate.hbm2ddl.auto" value="create"/> </properties> </persistence-unit> </persistence> 

定义了持久性configuration之后,让我们继续主要的scala文件:

 package nl.busa.jpa import javax.persistence.EntityManager import javax.persistence.EntityManagerFactory import javax.persistence.Persistence import scala.collection.JavaConversions._ object HibernateJpaScalaTutorial { var entityManagerFactory: EntityManagerFactory = Persistence.createEntityManagerFactory( "nl.busa.jpa.HibernateJpaScalaTutorial" ) var entityManager: EntityManager = entityManagerFactory.createEntityManager() def main( args : Array[String]) { entityManager.getTransaction().begin() entityManager.persist( new Buddy( "Natalino", "Busa" ) ) entityManager.persist( new Buddy( "Angelina", "Jolie" ) ) entityManager.persist( new Buddy( "Kate", "Moss" ) ) entityManager.getTransaction().commit() entityManager.getTransaction().begin(); val allBuddies = entityManager.createQuery("From Buddy", classOf[Buddy]).getResultList.toList entityManager.getTransaction().commit(); allBuddies foreach println entityManager.close(); } } 

代码非常简单。 一旦通过工厂创build了JPA EntityManager,就可以使用hibernate和jpa文档中定义的方法来插入,删除和查询数据模型。

这个例子已经使用sbt设置了。 检索完所需的软件包并编译源代码后,运行本教程将生成以下日志:

 HibernateJpaScalaTutorial:-:1.0.0> run [info] Running nl.busa.jpa.HibernateJpaScalaTutorial 1 = Natalino Busa 2 = Angelina Jolie 3 = Kate Moss [success] Total time: 4 s, completed Dec 9, 2012 4:18:00 PM 

有问题。 由于JPA的某些function利用嵌套注释(例如集合),因此您遇到了麻烦,因为Scala尚不支持嵌套注释。 2.8出来的时候会消失。

有关此主题的更多信息,请参阅Wille Faler的博客 ,以及其他不兼容的内容。

请注意,Scala 2.8现在在RC5中,预计将很快发布,支持嵌套注释。 该版本还有许多其他很酷的function。

我正在使用与Scalahibernate。 我必须解决的真正问题是如何在Hibernate中坚持枚举。 我把我的工作解决scheme放在github上

斯卡拉枚举,hibernate

基本上需要定义自己的UserType

 abstract class EnumerationAbstractUserType(val et: Enumeration) extends UserType { .... override def nullSafeGet(resultSet: ResultSet, names: Array[String], session: SessionImplementor, owner: Object): Object = { val value = resultSet.getString(names(0)) if (resultSet.wasNull()) null else et.withName(value) } override def nullSafeSet(statement: PreparedStatement, value: Object, index: Int, session: SessionImplementor): Unit = { if (value == null) { statement.setNull(index, Types.VARCHAR) } else { val en = value.toString statement.setString(index, en) } } 

我没有直接与scala一起使用Hibernate,但是我正在使用JPA。 Hibernate提供了一个JPA实现,而你定义JPA持久化类或者Hibernate的方式没有多大区别,所以我认为在没有JPA层的情况下使用Hibernate是可能的

查看Scala版本的Play Framework ,其中有完整的适用于Scala的JPA。