我即将编写一个依赖于MySQL数据库的Scala命令行应用程序.我一直在四处寻找Orms,但我很难找到一个可以很好地工作的.

Lift ORM看起来不错,但我不确定它能否与整个Lift web框架解耦.ActiveObjects看起来也不错,但作者说它可能无法与Scala配合使用.

我不是从Java来到Scala的,所以我不知道所有的 Select .有没有人在Scala中使用过ORM?如果有,您使用的是什么?它的工作效果如何?

推荐答案

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

  • there are no nested annotations as states the Scala 2.8 Preview -- that means you cannot use annotations as mapping metadata for complex applications (even the simplest ones often use @JoinTable -> @JoinColumn);
  • Scala和Java集合之间的不一致使开发人员转换集合;还有一些情况下,如果不实现底层框架的复杂接口(例如Hibernate的PersistentCollections),就不可能将Scala集合映射到关联;
  • 一些非常常见的特性,比如域模型验证,需要持久化类上的JavaBeans约定--这些东西并不完全是"Scala方式";
  • 当然,互操作问题(如原始类型或代理)带来了一个全新的问题级别,这些问题无法轻易解决.

我相信还有更多的原因.这就是为什么我们已经开始了Circumflex ORM project年.这个纯Scala ORM尽最大努力消除classic Java ORM的噩梦.具体来说,您定义实体的方式与使用classic 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]

正如您所看到的,这些声明比classic 的JPAPOJO更加冗长.但事实上,有几个概念组合在一起:

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

Triflex ORM唯一缺少的是:

  • 多列主键(虽然可以创建多列唯一约束支持的多列外键,但仅用于数据完整性);
  • 完整的文档(尽管我们正在积极工作);
  • 以扬抑ORM为核心技术的100亿美元生产系统的成功 case .

另外,我希望这篇文章不会被视为广告.事实并非如此,我只是尽量客观.

Database相关问答推荐

MongoDB事务,回调API方法

如何使授权服务器与外部数据库保持同步?

如何替换对象数组内的数组元素

Rust 全局存储数据库连接

使用 noSQL 和 MongoDB 在数据库中存储任何类型文件的最佳方法是什么

何时将数据库称为嵌入式数据库?

Android Room持久性库@Update不起作用

阿拉伯字符串上的 WHERE 子句匹配问题

通过生成迁移将索引:唯一添加到 ruby​​ on rails 中的列

如何更改 SQLite 数据库列中的值?

将数据库表用作作业(job)队列的最佳方式是什么?

数据库表中的索引有什么缺点?

JavaScript 布尔搜索查询生成器接口库?

如何在 Rails 中不启动事务的情况下运行迁移?

A QuerySet 按聚合字段值

使用 PHP/PDO 判断数据库表是否存在

PostgreSQL 唯一索引和字符串大小写

将文本列设为唯一键

我应该在哪里存储外键?

是否有任何支持协议缓冲区的数据库?