我编写了一个小事务助手,它会传递一个闭包并在事务中执行它:
object Transaction {
val emf = Persistence.createEntityManagerFactory("defaultPersistenceUnit")
def execute(action: EntityManager => Unit) {
val em = emf.createEntityManager()
em.getTransaction.begin()
action(em)
em.getTransaction.commit()
em.close()
}
}
然后我有ItemRepository
这样的话:
object ItemRepository {
def add(implicit entityManager: EntityManager, item: Item) {
entityManager.persist(item)
}
}
最后,我想要隐式传递EntityManager执行存储库方法:
Transaction.execute(implicit em => ItemRepository.add(item))
但是编译器告诉我:
没有足够的方法添加参数:(隐式实体管理器: javax.persistence.EntityManager,隐含项:models.Item)单位。 未指定的值参数项。
如果我明确传递参数,那么一切都有效:
Transaction.execute(em => ItemRepository.add(em, item))
这里有什么问题?它看起来与此answer几乎相同。
答案 0 :(得分:7)
隐式修饰符适用于整个参数列表,而不仅仅适用于一个参数。因此,如果您希望entitiyManager参数是隐式的并且item参数不是隐式的,那么您必须这样写:
object ItemRepository {
def add(item: Item)(implicit entityManager: EntityManager) {
entityManager.persist(item)
}
}
否则编译器假定您要显式传递整个参数列表,然后抱怨参数太少。