什么ORM与Scala一起使用?

Cli*_*ach 41 database orm scala

我即将编写一个依赖于MySQL数据库的Scala命令行应用程序.我一直在寻找ORM,我很难找到一个效果很好的东西.

电梯ORM看起来不错,但我不知道它可以从整个电梯Web框架脱钩.ActiveObjects看起来还不错,但作者说它可能不适用于Scala.

我不是来自Java的Scala,所以我不知道所有选项.有没有人使用过Scala的ORM,如果有的话,你使用了什么以及它有多好用?

inc*_*ate 34

面向JPA的框架(例如Hibernate)不能优雅地适应惯用的Scala应用程序有几个原因:

  • 没有嵌套注释作为Scala 2.8 Preview的状态 - 这意味着您不能将注释用作复杂应用程序的映射元数据(即使是最简单的应用程序@JoinTable- > @JoinColumn);
  • Scala和Java集合之间的不一致使开发人员转换集合; 还有一些情况是,如果不实现底层框架的复杂接口(PersistentCollections例如Hibernate),就无法将Scala集合映射到关联;
  • 一些非常常见的功能,例如域模型验证,需要对持久化类的JavaBeans约定 - 这些东西并不是"Scala方式"的做法;
  • 当然,互操作问题(如原始类型或代理)引入了一个无法轻易绕过的全新问题.

我确信有更多的理由.这就是我们启动Circumflex ORM项目的原因.这个纯Scala ORM试图消除经典Java ORM的噩梦.具体来说,您可以使用经典DDL语句以相同的方式定义实体:

class User extends Record[User] {
  val name = "name".TEXT.NOT_NULL
  val admin = "admin".BOOLEAN.NOT_NULL.DEFAULT('false')
}

object User extends Table[User] {
  def byName(n: String): Seq[User] = criteria.add(this.name LIKE n).list
}

// example with foreign keys:
class Account extends Record[Account] {
  val accountNumber = "acc_number".BIGINT.NOT_NULL
  val user = "user_id".REFERENCES(User).ON_DELETE(CASCADE)
  val amount = "amount".NUMERIC(10,2).NOT_NULL
}

object Account extends Table[Account]
Run Code Online (Sandbox Code Playgroud)

如您所见,这些声明比经典的JPA POJO更冗长.但实际上有几个概念组合在一起:

  • 用于生成模式的精确DDL(您可以以类似DSL的方式轻松添加索引,外键和其他内容);
  • 所有查询都可以在"表对象"内组装,而不是分散在DAO中; 查询本身非常灵活,您可以在变量中存储查询对象,谓词,投影,子查询和关系别名,以便您可以重用它们,甚至可以从现有查询中进行批量更新操作(例如insert-select);
  • 关联之间的透明导航(一对一,多对一,一对多和多对多通过中间关系)可以通过懒惰或急切的提取策略来实现; 在这两种情况下,协会都建立在潜在关系的外键之上;
  • 验证是框架的一部分;
  • 还有一个Maven2插件,允许生成模式并从方便的XML格式文件导入初始数据.

Circumflex ORM唯一缺少的是:

  • 多列主键(尽管可以创建由多列唯一约束支持的多列外键,但它仅用于数据完整性);
  • 完整的文件(尽管我们正在积极研究);
  • 拥有Circumflex ORM作为其核心技术的价值数十亿美元的生产系统的成功案例.

PS我希望这篇文章不会被视为广告.实际上并非如此 - 我试图尽可能客观.

  • 很高兴看到更多关注本机Scala中的ORM空间.我遇到的另一个图书馆是http://squeryl.org/.为您的查询提供.net Linq样式功能. (3认同)

小智 9

我试用了EclipseLink JPA,基本操作对我来说很好.JPA是Java标准,还有其他实现也可以工作(OpenJPA等).下面是Scala中JPA类的示例:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity { val name = "Users" }
class User {
  @Id
  @GeneratedValue
  var userid:Long = _

  var login:String = _

  var password:String = _

  var firstName:String = _

  var lastName:String = _
}
Run Code Online (Sandbox Code Playgroud)


Jac*_*ack 5

Slick是功能世界的完美搭档。传统的 ORM 并不适合 Scala。Slick 组合得很好,并使用 DSL 来模拟 Scala 集合类和用于推导。