Java 冬眠与斯卡拉
我一直在玩弄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更强大的库Java 冬眠与斯卡拉,java,hibernate,scala,Java,Hibernate,Scala,我一直在玩弄Scala,我想知道是否有人有过使用hibernate和mysql作为Scala对象持久存储的经验?它是开箱即用还是有很多事情要做?我没有直接将Hibernate与scala一起使用,但我使用的是JPA。Hibernate提供了一个JPA实现,您定义JPA持久类或Hibernate类的方式没有太大不同,因此我认为在没有JPA层的情况下使用Hibernate是可能的大多数情况下,Scala+Hibernate工作得非常好,有一些小问题可以轻松克服。对于exmaple,在处理集合时,Hi
您可能想查看“post”以了解更多信息。存在一些问题。因为JPA的一些特性利用了嵌套注释,例如集合,所以您会遇到麻烦,因为Scala还不支持嵌套注释。当2.8出来的时候,它就消失了
有关此主题以及其他不兼容性的更多信息,请参阅。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
}
注意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)
}
}