2010-06-02 122 views
3

我想知道什么是在Lift中的JPA模型的最佳做法? I 注意到,在jpa演示应用程序中,只有一个Model对象 ,它就像一个完成所有任务的超级对象。我不认为这个 可以是最可扩展的方法,不是吗?什么是Lift-JPA应用程序的良好体系结构?

在Lift中继续使用DAO模式是明智的吗?例如, 有一些代码,看起来稍微臃肿,可以在所有的模型对象进行简化 :

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

可能是:

AuthorDao.remove(someId) 

我会很感激任何提示设立的东西,将以Lift的方式与 合作,并且易于组织和维护。最好从实际使用JPA的中型到大型电梯网站的人员,而不是仅仅假设Spring做什么(我们知道如何做到这一点);)

第一阶段的开发将在30-40个表格左右,并且将 最终超过100 ...我们需要一个可扩展,整洁的方法。

回答

2

从后人(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. 

} 

最后,我们与电梯一体化是一些代码的形式 包裹每个请求:

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

}) 

我省略了一些错误处理这里,使想法更清楚,但是 的意图是每个HTTP请求都在一个事务中执行,而这个事务要么全部成功,要么全部失败。由于MyDBModel是 ,当它初次触摸时,在您的测试代码中,您可以根据需要配置 EM,并且数据对象与此 配置隔离。

希望这是有用的。

肖恩

+0

你如何测试严重依赖全局变量的代码(如你的例子中的'MyDBModel')。如果不涉及整个堆栈,是不是很复杂? – Theo 2010-06-14 05:24:29

相关问题