Hibernate和Scala

Ube*_*lex 37 java hibernate scala

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

sha*_*ang 23

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

您可以查看Frank Sommers的帖子了解更多信息.

  • _Note:_在scala 2.8中,`scala.collection.jcl.Conversions`被移动到`scala.collection.JavaConversions`.所以你应该在scala 2.8+中使用`import scala.collection.JavaConversions._`.文件:http://www.scala-lang.org/api/current/scala/collection/JavaConversions$.html. (2认同)

nat*_*usa 16

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

试验hibernate和scala的最简单方法是通过hibernate/jpa使用内存中的hsqldb数据库.首先,让我们定义域模型.在这种情况下,scala类根据hibernate样式注释,关于我的好友.

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
}
Run Code Online (Sandbox Code Playgroud)

注意scala类比java类更紧凑,因为我们不需要典型的getter/setter样板代码.现在让我们确保加载了jpa模块和数据库模型.根据hibernate规范,让我们添加众所周知的hibernate配置文件: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>
Run Code Online (Sandbox Code Playgroud)

定义持久性配置后,让我们继续主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();

  }
}
Run Code Online (Sandbox Code Playgroud)

代码非常简单.一旦通过工厂创建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
Run Code Online (Sandbox Code Playgroud)