Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 冬眠与斯卡拉_Java_Hibernate_Scala - Fatal编程技术网

Java 冬眠与斯卡拉

Java 冬眠与斯卡拉,java,hibernate,scala,Java,Hibernate,Scala,我一直在玩弄Scala,我想知道是否有人有过使用hibernate和mysql作为Scala对象持久存储的经验?它是开箱即用还是有很多事情要做?我没有直接将Hibernate与scala一起使用,但我使用的是JPA。Hibernate提供了一个JPA实现,您定义JPA持久类或Hibernate类的方式没有太大不同,因此我认为在没有JPA层的情况下使用Hibernate是可能的大多数情况下,Scala+Hibernate工作得非常好,有一些小问题可以轻松克服。对于exmaple,在处理集合时,Hi

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

我没有直接将Hibernate与scala一起使用,但我使用的是JPA。Hibernate提供了一个JPA实现,您定义JPA持久类或Hibernate类的方式没有太大不同,因此我认为在没有JPA层的情况下使用Hibernate是可能的

大多数情况下,Scala+Hibernate工作得非常好,有一些小问题可以轻松克服。对于exmaple,在处理集合时,Hibernate需要使用java.util接口。但是您可以导入scala.collection.jcl.Conversions.\u如果您想利用scala更强大的库


您可能想查看“post”以了解更多信息。

存在一些问题。因为JPA的一些特性利用了嵌套注释,例如集合,所以您会遇到麻烦,因为Scala还不支持嵌套注释。当2.8出来的时候,它就消失了


有关此主题以及其他不兼容性的更多信息,请参阅。

Scala查询不是Hibernate,但可能很有趣


请注意,Scala 2.8支持嵌套注释,该版本目前在RC5中,预计不久将发布。该版本还有许多其他很酷的功能。

看看哪里有针对Scala的完整JPA改编。

这肯定不是很多工作。一个简单的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规范,让我们添加众所周知的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>
代码非常简单。一旦通过工厂创建了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

我正在使用hibernate和Scala。我必须解决的真正问题是如何在hibernate中持久化枚举。我已将我的工作解决方案放在github上

基本上需要定义自己的用户类型

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)
    }
 }

注意:在Scala2.8中,
scala.collection.jcl.Conversions
被移动到
scala.collection.JavaConversions
。因此,您应该在scala 2.8+中使用
import scala.collection.JavaConversions.
。文档:。请注意,使用Scala和Hibernate时枚举有点麻烦,但它们是可以实现的。尽管令人惊讶的是,在Java中更容易实现,但第二个链接已经失效
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)
    }
 }