Scala与Spring:强强联合
2010-08-04 00:00:00 来源:WEB开发网jpaTemplate.execute((em:EntityManager) => em.createQuery(…)// etc. ); 问题在于如何通过优雅的方式实现这个功能。
关于getter和setter:使用了Spring bean的类至少要有一个setter方法,该方法对应于特定bean的名称。毫无疑问,这些setter是框架所需的样板代码,如果不使用构造器注入也能避免这一点岂不美哉?
实现
如果用Scala实现泛型与Person DAO,那么上面提到的一切问题都将迎刃而解,请看:
object GenericJpaDaoSupport {
implicit def jpaCallbackWrapper[T](func:(EntityManager) => T) = {
new JpaCallback {
def doInJpa(session:EntityManager ) = func(session).asInstanceOf[Object]}
}
}
import Scala.collection.jcl.Conversions._
class GenericJpaDaoSupport[T](val entityClass:Class[T]) extends JpaDaoSupport with GenericDao[T] {
def findAll():List[T] = {
getJpaTemplate().find("from " + entityClass.getName).toList.asInstanceOf[List[T]]
}
def save(entity:T) :T = {
getJpaTemplate().persist(entity)
entity
}
def remove(entity:T) = {
getJpaTemplate().remove(entity);
}
def findById(id:Serializable):T = {
getJpaTemplate().find(entityClass, id).asInstanceOf[T];
}
}
class JpaPersonDao extends GenericJpaDaoSupport(classOf[Person]) with PersonDao {
def findByName(name:String) = { getJpaTemplate().executeFind( (em:EntityManager) => {
val query = em.createQuery("SELECT p FROM Person p WHERE p.name like :name");
query.setParameter("name", "%" + name + "%");
query.getResultList();
}).asInstanceOf[List[Person]].toList
}
}
赞助商链接