2

我写了一个小事务助手,它通过闭包并在事务中执行它:

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))

但是编译器告诉我:

方法添加的参数不足:(隐式 entityManager:javax.persistence.EntityManager,隐式项目:models.Item)Unit。未指定值参数项。

如果我明确传递参数,一切正常:

Transaction.execute(em => ItemRepository.add(em, item))

这里有什么问题?它看起来与此答案中的几乎相同。

4

1 回答 1

7

隐式修饰符适用于整个参数列表,而不仅仅是一个参数。因此,如果您希望 entityManager 参数是隐式的,而 item 参数不是隐式的,则必须这样编写:

object ItemRepository {
  def add(item: Item)(implicit entityManager: EntityManager) {
    entityManager.persist(item)
  }
}

否则,编译器会假定您要显式传递整个参数列表,然后抱怨参数太少。

于 2013-01-11T12:18:32.260 回答