Architecture 什么是Lift JPA应用程序的良好体系结构?

Architecture 什么是Lift JPA应用程序的良好体系结构?,architecture,scala,jpa,lift,Architecture,Scala,Jpa,Lift,我想知道在电梯中JPA模型的最佳实践是什么?我 注意,在jpa演示应用程序中,只有一个模型对象 这就像一个超级物体,做任何事情。我不这么认为 可能是最具可扩展性的方法,不是吗 在Lift中仍然使用刀模式是否明智?例如 有些代码看起来有点臃肿,可以简化 跨所有模型对象: Model.remove(Model.getReference(classOf[Author], someId)) 可以是: AuthorDao.remove(someId) 如果你能给我一些建议,我会很感激的 升降机的工作方

我想知道在电梯中JPA模型的最佳实践是什么?我 注意,在jpa演示应用程序中,只有一个模型对象 这就像一个超级物体,做任何事情。我不这么认为 可能是最具可扩展性的方法,不是吗

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

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
)。不涉及整个堆栈不是很复杂吗?