gpt4 book ai didi

architecture - Lift-JPA 应用程序的良好架构是什么?

转载 作者:行者123 更新时间:2023-12-04 04:07:15 25 4
gpt4 key购买 nike

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

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

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

可能是:

AuthorDao.remove(someId)

我将不胜感激有关设置适用于Lift 想要的工作方式,也易于组织和维护。最好来自在大中型 Lift 站点上实际使用过 JPA 的人,而不是仅仅假设 Spring 做了什么(我们知道该怎么做);)

一期开发约30-40 table ,以后最终超过 100...我们需要一种可扩展的、简洁的方法。

最佳答案

转自 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,并且数据对象与此隔离配置。

希望这是有用的。

肖恩

关于architecture - Lift-JPA 应用程序的良好架构是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2957264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com