休眠和斯卡拉 [已关闭]

2022-09-01 05:14:03

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


答案 1

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

您可能想查看Frank Sommers的帖子以获取更多信息。


答案 2

这绝对不是很多工作。一个简单的休眠 + 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

推荐