2013-01-11 36 views
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)單位。 未指定的值參數項目。

一切正常,如果我通過了參數顯式:

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

有什麼不對嗎?它看起來幾乎和這個answer一樣。

回答

7

隱式修飾符適用於整個參數列表,而不僅僅適用於一個參數。所以,如果你想entitiyManager參數是隱式和項目論證不被隱式的,你必須把它寫這樣的:

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

否則編譯器假定您要明確,然後傳遞的參數整個列表抱怨參數太少。