Lift-JPA应用程序的优秀架构是什么?

时间:2010-06-02 11:37:14

标签: architecture scala jpa lift

我想知道Lift中JPA模型的最佳实践是什么?一世 注意到在jpa演示应用程序中,只有一个Model对象 这就像一个完成一切的超级对象。我不这么认为 可以是最具扩展性的方法,不是吗?

仍然在Lift中执行DAO模式是明智的吗?例如, 有些代码看起来有点臃肿,可以简化 跨所有模型对象:

Model.remove(Model.getReference(classOf[Author], someId))

可能是:

AuthorDao.remove(someId)

我很感激有关设置可以使用的内容的任何提示 Lift想要工作的方式,也很容易组织和维护。最好是那些在中型到大型Lift网站上实际使用过JPA的人,而不仅仅是假设Spring做了什么(我们知道该怎么做);)

第一阶段的发展将是30-40个表,并将 最终达到100多...我们需要一种可扩展的,简洁的方法。

1 个答案:

答案 0 :(得分:2)

从Lift邮件列表中转发后代(source here):

我可以对我们如何使用JPA有所了解。我不确定是什么类型的 你正在使用的容器,但我们正在使用JBoss 4.2.2和 使用其连接池设施。

我们利用scalajpa库来初始化JPA的东西并保持一个 在线程局部变量中引用实体管理器。我们 特别是不要使用Lift RequestVarEM,因为它的生命周期 RequestVar比常规HTTP请求稍微复杂一点, 这可能导致连接没有返回到池中 及时时尚。

第一步是创建“模型”,并将其指向单元名称 来自你的persistence.xml:

object MyDBModel extends LocalEMF("unitName", false) with
ThreadLocalEM

我们已经创建了一些代码来简化操作。 我们的每个持久化类都混合在一起,提供了一些基本的JPA 操作:

trait Persistent {
   def persist = DBModel.persist(this)
   def merge = DBModel.merge(this)
   def remove = DBModel.remove(this)

}

例如,

@Entity
@Table{val name="person"}
class Person extends Persistent {

@Id
var id:String = _

@Column {val name="first_name", val nullable = false, val
updatable=false}
var firstName:String = _

@Column {val name="last_name", val nullable = false, val
updatable=false}
var lastName:String = _

@OneToMany{ ... }
var roles:Set[Role] = new HashSet[Role]()

// etc.

}

我们主要使用映射的集合来导航对象模型, 并在配对对象上放置更复杂的数据库方法,以便 我们没有分散在整个代码中的MyDBModel的引用 (正如你所说,这是一种不受欢迎的做法)。例如:

object Person {
def findByLastName = MyDBModel.createQuery[Person]
("...").findAll.toList

// etc.

}

最后,我们与Lift的集成是以一些代码的形式 包装每个请求:

S.addAround(new LoanWrapper {
   def apply[T](f: => T):T = {
      try {
         f
      }
      catch {
         case e => MyDBModel.getTransaction.setRollbackOnly
      }
      finally {
         MyDBModel.cleanup
      }
   }

})

我在这里省略了一些错误处理,以使这个想法更清晰,但是 意图是每个HTTP请求在一个事务中执行 无论是成功还是失败。因为MyDBModel是 在第一次触摸时初始化,在您的测试代码中,您可以进行操作 您认为合适的EM,数据对象与此隔离 配置。

希望这很有用。

肖恩