休眠和斯卡拉 [已关闭]
我一直在玩Scala,我想知道是否有人有过使用hibernate和mysql作为Scala对象的持久存储的经验?它是开箱即用的,还是有很多事情要做?
我一直在玩Scala,我想知道是否有人有过使用hibernate和mysql作为Scala对象的持久存储的经验?它是开箱即用的,还是有很多事情要做?
大多数时候,Scala + Hibernate工作得很好,有一些小的颠簸可以很容易地克服。例如,在处理集合时,Hibernate需要使用java.util接口。但是,如果您想利用Scala更强大的库,则可以导入scala.collection.jcl.Conversions._。
您可能想查看Frank Sommers的帖子以获取更多信息。
这绝对不是很多工作。一个简单的休眠 + scala 示例可以在几十行中定义。Scala和Java可以在同一项目中混合使用。特别是,冬眠-scala组合使得将JPA框架和非常灵活的orm层与scala提供的不可变结构和函数式编程的优雅相结合成为可能。
试验休眠和 scala 的最简单方法是通过 hibernate/jpa 使用内存中的 hsqldb 数据库。首先,让我们定义领域模型。在这种情况下,一个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 模块和数据库模型。根据休眠规范,让我们添加众所周知的休眠配置文件: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>
定义持久化配置后,让我们转到主 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();
}
}
代码非常简单。通过工厂创建 JPA EntityManager 后,可以使用休眠和 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