Architecture 什么是Lift JPA应用程序的良好体系结构?
我想知道在电梯中JPA模型的最佳实践是什么?我 注意,在jpa演示应用程序中,只有一个模型对象 这就像一个超级物体,做任何事情。我不这么认为 可能是最具可扩展性的方法,不是吗 在Lift中仍然使用刀模式是否明智?例如 有些代码看起来有点臃肿,可以简化 跨所有模型对象:Architecture 什么是Lift JPA应用程序的良好体系结构?,architecture,scala,jpa,lift,Architecture,Scala,Jpa,Lift,我想知道在电梯中JPA模型的最佳实践是什么?我 注意,在jpa演示应用程序中,只有一个模型对象 这就像一个超级物体,做任何事情。我不这么认为 可能是最具可扩展性的方法,不是吗 在Lift中仍然使用刀模式是否明智?例如 有些代码看起来有点臃肿,可以简化 跨所有模型对象: Model.remove(Model.getReference(classOf[Author], someId)) 可以是: AuthorDao.remove(someId) 如果你能给我一些建议,我会很感激的 升降机的工作方
Model.remove(Model.getReference(classOf[Author], someId))
可以是:
AuthorDao.remove(someId)
如果你能给我一些建议,我会很感激的
升降机的工作方式也易于组织和维护。最好是那些在中大型电梯现场实际使用过JPA的人,而不是仅仅假设Spring会做什么(我们知道怎么做);)
开发的第一阶段将是大约30-40张桌子,并且
最终达到100多。。。我们需要一种可扩展的、整洁的方法。从Lift邮件列表转发给后代(): 我可以为我们如何使用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是您认为合适的,并且数据对象与此隔离
配置
希望这是有用的
Sean如何测试严重依赖全局变量的代码(例如示例中的
MyDBModel
)。不涉及整个堆栈不是很复杂吗?