2014-12-03 77 views
0

我想將第二個數據庫連接到我在PlayFramework2中編寫的Web應用程序。PlayFramework使用jpa /休眠訪問輔助數據庫數據

我已經正確配置了我的應用程序。我已經添加了第二個來源callec crm。 這裏是我的控制檯日誌:

--- (RELOAD) --- 

[info] play - datasource [jdbc:mysql://localhost/svp] bound to JNDI as DefaultDS 
[info] play - datasource [jdbc:mysql://192.168.0.4/scrm_customer] bound to JNDI as CRM 
[info] play - database [default] connected at jdbc:mysql://localhost/svp 
[info] play - database [CRM] connected at jdbc:mysql://192.168.0.4/scrm_customer 
[info] play - Application started (Dev) 

我已經添加到我的persistence.xml如下:

<persistence-unit name="CRM" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <non-jta-data-source>CRM</non-jta-data-source> 
</persistence-unit> 

我爲配置:

db.default.jndiName=DefaultDS 
db.default.driver=com.mysql.jdbc.Driver 
db.default.url="jdbc:mysql://localhost/svp" 
db.default.user=root 
db.CRM.jndiName=CRM 
db.CRM.driver=com.mysql.jdbc.Driver 
db.CRM.url="jdbc:mysql://192.168.0.4/scrm_customer" 
db.CRM.user=root 
db.default.logStatements=true 
jpa.default=defaultPersistenceUnit 

但是,當我試圖讓從第二個分貝的一些數據使用代碼如下:

List<Customer> allCustomers = (List<Customer>) JPA.em("CRM") 
     .createQuery("FROM Customer", Customer.class) 
     .getResultList(); 

我得到一個錯誤:

[error] play - Cannot invoke the action, eventually got an error: java.lang.RuntimeException: No JPA EntityManagerFactory configured for name [CRM] 
[error] application - 

! @6kd0136e7 - Internal server error, for (GET) [/SupraADMIN/klienci] -> 

play.api.Application$$anon$1: Execution exception[[RuntimeException: No JPA EntityManagerFactory configured for name [CRM]]] 
     at play.api.Application$class.handleError(Application.scala:293) ~[play_2.10-2.2.4.jar:2.2.4] 
     at play.api.DefaultApplication.handleError(Application.scala:399) [play_2.10-2.2.4.jar:2.2.4] 
     at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:264) [play_2.10-2.2.4.jar:2.2.4] 
     at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3$$anonfun$applyOrElse$3.apply(PlayDefaultUpstreamHandler.scala:264) [play_2.10-2.2.4.jar:2.2.4] 
     at scala.Option.map(Option.scala:145) [scala-library.jar:na] 
     at play.core.server.netty.PlayDefaultUpstreamHandler$$anonfun$3.applyOrElse(PlayDefaultUpstreamHandler.scala:264) [play_2.10-2.2.4.jar:2.2.4] 
Caused by: java.lang.RuntimeException: No JPA EntityManagerFactory configured for name [CRM] 
     at play.db.jpa.JPA.em(JPA.java:34) ~[play-java-jpa_2.10-2.2.4.jar:2.2.4] 
     at models.Customer.getCRMList(Customer.java:124) ~[na:na] 
     at controllers.admin.CMS.Customers(CMS.java:157) ~[na:na] 
     at admin.Routes$$anonfun$routes$1$$anonfun$applyOrElse$24$$anonfun$apply$24.apply(routes_routing.scala:429) ~[na:na] 
     at admin.Routes$$anonfun$routes$1$$anonfun$applyOrElse$24$$anonfun$apply$24.apply(routes_routing.scala:429) ~[na:na] 
     at play.core.Router$HandlerInvoker$$anon$7$$anon$2.invocation(Router.scala:183) ~[play_2.10-2.2.4.jar:2.2.4] 
[error] application - REGUEST: GET /SupraADMIN/klienci GENERATED ERROR: @6kd0136e7: Execution exception in /home/korbeldaniel/Aplikacje/Eclipse/SVP/modules/common/app/models/Customer.java:124 

我怎麼錯過?我檢查過官方文檔,但沒有發現有用的東西。

請幫

回答

0

標註您的控制器的方法有以下注釋:

@Transactional(value = "CRM", readOnly = true) 

和控制方法中執行:

JPA.em().createQuery("FROM Customer", Customer.class).getResultList(); 

或者,如果你不想使用註釋:

List<Customer> customers = JPA.withTransaction("CRM", true, new Function0<List<Customer>>() { 

     @Override 
     public List<Customer> apply() throws Throwable { 
      return JPA.em().createQuery("FROM Customer", Customer.class).getResultList(); 
     } 
    }); 

我強烈建議使用JPA.withTransactionAsync代替。