Play!2.1 通过JPA连接多个数据库
Play framework连接多数据库很简单。
但是这个很简单耗费了我整整两天的时间来找到这个答案。
还好苍天,我还是找到了。
=============================================================
Play通过Ebean好像可以很方便的链接多数据库,但是我使用的是JPA。
所以关于EBEAN是不是能“很方便的”连接多数据库我尽量不发表言论。
Hibernate连接数据库的方法据说有两种:
1.注解@PersistenceUnit或@PersistenceContext
2.配置JPA.getJPAConfig
完全不知道的可以继续往下看,否则可以跳过这一段。
先说想Play JPA中多数据源的配置吧。
先增加持久化单元:在conf/META-INF的persistence.xml中增加,完后是这样:
<persistence-unit name="defaultPersistenceUnit" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <non-jta-data-source>DefaultDS</non-jta-data-source> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> </properties> </persistence-unit> <persistence-unit name="ojdbcPersistenceUnit" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <non-jta-data-source>OracleDS</non-jta-data-source> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/> </properties> </persistence-unit>
然后在application.conf中增加数据源,完后如下:
db.default.driver=org.h2.Driver db.default.url="jdbc:h2:file:E:/work/setup/db/data" db.default.user=sa db.default.password=sa db.default.auth=false db.default.jndiName=DefaultDS jpa.default=defaultPersistenceUnit db.oracle.driver=oracle.jdbc.driver.OracleDriver db.oracle.url="jdbc:oracle:thin:@10.1.20.65:1521:abc" db.oracle.user=LOG db.oracle.password=LOG db.oracle.jndiName=OracleDS jpa.oracle=ojdbcPersistenceUnit
接下来就是痛苦的探索如何进行多数据库访问。
在网上搜索“jpa 多数据源”找到的基本都是和SPRING结合的,没想到JPA已经快成为spring的专属了。。。
通过在stackof上提问,得到的答案是刚才提到的两种方法:
但是这两种方法都不能奏效。可以留意我在问题下面的跟注。
http://stackoverflow.com/questions/16611839/play-framework-2-jpa-with-multiple-persistenceunit
http://play.lighthouseapp.com/projects/57987/tickets/706-multiple-databasejpa-support
尤其后来找到这个
http://stackoverflow.com/questions/8001809/jpa-getjpaconfig-method-not-found-on-plays-api
幸运的是终于找到了这个
http://stackoverflow.com/questions/10911492/play-framework-2-0-connecting-to-multiple-databases
从问题下面作者的回复看到尽管
jpa.getConfig("sth").em()
不管事,但是可以用
jpa.em("sth")
于是改成这样:
JPA.em("default").createQuery(
大功终于告成 。只要为em()指定连接对象即可