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

しかし、コンパイラは私にこう言います:

メソッドaddの引数が不十分です:(暗黙のentityManager:javax.persistence.EntityManager、暗黙のアイテム:models.Item)Unit。不特定の値のパラメータ項目。

パラメータを明示的に渡すと、すべてが機能します。

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

ここで何が問題になっていますか?この回答とほとんど同じように見えます。

4

1 に答える 1

7

暗黙の修飾子は、1 つの引数だけでなく、引数リスト全体に適用されます。したがって、entitiyManager 引数を暗黙的にし、item 引数を暗黙的にしない場合は、次のように記述する必要があります。

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

そうしないと、コンパイラーは、パラメーターのリスト全体を明示的に渡す必要があると想定し、パラメーターが少なすぎると不平を言います。

于 2013-01-11T12:18:32.260 に答える