Aries JPA container是一个持久化容器,但它不类似Hibernate,而只是相当于Hibernate的一部分,它还需要如OpenJPA之类的JPA实现的支持,才能真正地完成持久化的工作。
一个常见的OSGI JPA应用可以是这样的:若干个用JPA的规范编写的实体(Entity),集合在一个Bundle里,并用persistence.xml描述成一个持久化单元(persistence unit)。而persistence.xml里则通过JNDI将JDBC DataSource与该域绑定。最后,Aries JPA container就能将持久化单元的EntityManagerFactory或EntityManager提供给应用来引用。
以下是一个例子:
persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="com.ponder.examples.jpa01PU" transaction-type="RESOURCE_LOCAL">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<non-jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/jpa01DS)</non-jta-data-source>
<class>com.ponder.examples.jpa01.CustomerEntity</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)"/>
</properties>
</persistence-unit>
</persistence>
blueprint.xml:
<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.0.0">
<cm:property-placeholder persistent-id="com.ponder.examples.jpa01">
<cm:default-properties>
<cm:property name="DS.DriverName" value="com.mysql.jdbc.Driver" />
<cm:property name="DS.Url" value="jdbc:mysql://192.168.0.1:3306/mydb" />
<cm:property name="DS.User" value="user" />
<cm:property name="DS.Password" value="password" />
<cm:property name="DS.InitialSize" value="5" />
<cm:property name="DS.MinIdle" value="5" />
<cm:property name="DS.MaxIdle" value="20" />
<cm:property name="DS.MaxWait" value="1000" /> <!-- 1000毫秒 -->
<cm:property name="DS.MaxActive" value="30" />
<cm:property name="DS.LogAbandoned" value="true"/>
<cm:property name="DS.RemoveAbandoned" value="true"/>
<cm:property name="DS.RemoveAbandonedTimeout" value="180"/> <!-- 180秒 -->
<cm:property name="DS.TestWhileIdle" value="true"/>
<cm:property name="DS.TestOnBorrow" value="false"/>
<cm:property name="DS.TestOnReturn" value="false"/>
<cm:property name="DS.ValidationQuery" value="SELECT COUNT(0) FROM DUAL"/>
<cm:property name="DS.ValidationQueryTimeout" value="1"/>
<cm:property name="DS.TimeBetweenEvictionRunsMillis" value="30000"/>
<cm:property name="DS.NumTestsPerEvictionRun" value="30"/>
</cm:default-properties>
</cm:property-placeholder>
<bean id="jpa01DS" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${DS.DriverName}" />
<property name="url" value="${DS.Url}" />
<property name="username" value="${DS.User}" />
<property name="password" value="${DS.Password}" />
<property name="initialSize" value="${DS.InitialSize}"/>
<property name="minIdle" value="${DS.MinIdle}"/>
<property name="maxIdle" value="${DS.MaxIdle}"/>
<property name="maxWait" value="${DS.MaxWait}"/>
<property name="maxActive" value="${DS.MaxActive}"/>
<property name="logAbandoned" value="${DS.LogAbandoned}"/>
<property name="removeAbandoned" value="${DS.RemoveAbandoned}"/>
<property name="removeAbandonedTimeout" value="${DS.RemoveAbandonedTimeout}"/>
<property name="testWhileIdle" value="${DS.TestWhileIdle}"/>
<property name="testOnBorrow" value="${DS.TestOnBorrow}"/>
<property name="testOnReturn" value="${DS.TestOnReturn}"/>
<property name="validationQuery" value="${DS.ValidationQuery}"/>
<property name="validationQueryTimeout" value="${DS.ValidationQueryTimeout}"/>
<property name="timeBetweenEvictionRunsMillis" value="${DS.TimeBetweenEvictionRunsMillis}"/>
<property name="numTestsPerEvictionRun" value="${DS.NumTestsPerEvictionRun}"/>
</bean>
<service ref="jpa01DS" interface="javax.sql.DataSource">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/jpa01DS"/>
</service-properties>
</service>
</blueprint>
其中的关键点如下:
1、持久化单元(PU)定义(persistence.xml);
2、数据源(Datasource):采用apache的dbcp;
3、blueprint通过placeholder配置DataSource,并发布DataSource服务,并注册到JNDI ;
4、PU通过jndi引用Datasource;
5、部署时,karaf通过configAdmin服务将etc/com.ponder.examples.jpa01.cfg的配置信息读入到blueprint的placeholder处。
分享到:
相关推荐
Apache Aries项目是Apache软件基金会的一个开源项目,它旨在提供OSGi企业级应用所需的工具和容器,支持OSGi应用程序的开发、部署和运行。通过使用Aries,开发者可以更方便地利用OSGi的强大功能,比如服务动态发现、...
8. **社区与资源**:参与OSGi社区,获取最新的资讯和技术支持,利用开源项目如Apache Aries、Blueprint等来加速开发。 "OSGi原理与最佳实践"这本书可能会详细讲解以上各个方面,并可能包含实例代码和实战经验分享,...
Apache Aries是基于OSGi的一个开源项目,它提供了一组标准的服务和工具,用于简化基于OSGi的企业应用开发。通过使用这些工具和服务,开发者可以快速实现应用的模块化,并与现有的Java EE基础设施结合。 ...
标题中的"org.apache.aries.jmx.blueprint.api-...通过深入研究这些内容,开发者不仅可以了解如何在OSGi环境中使用Apache Aries JMX Blueprint API,还可以学习如何构建和优化工作流,以及如何参与到开源项目中去。
8. **企业应用集成**:OSGi被广泛应用于大型企业级应用,如Spring Dynamic Modules(Spring DM)和Apache Karaf,它们利用OSGi的特性来构建灵活、可扩展的应用平台。 9. **开发实践**:使用OSGi开发时,需要注意...
CXF 框架是一种基于 Servlet 技术的 SOA 应用开发框架,要正常运行基于 CXF 应用框架开发的企业应用,除了 CXF 框架本身之外,还需要 JDK 和 Servlet 容器的支持。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,...
12. **Aries**: Aries致力于提供OSGi的可插拔框架,帮助构建应用程序。 13. **Avro**: Avro是序列化框架,用于数据序列化和跨语言通信,常用于Hadoop生态系统中。 14. **Axis2**: Axis2是Apache的Web服务框架,...
1. **Apache Aries Project Activator**:Activator是Apache Aries项目的一部分,它提供了服务组件模型(Service Component Runtime, SCD)的轻量级实现,帮助开发者在OSGi环境中管理服务生命周期。 2. **JDBC...
Pax-Web和Pax-Web-Whiteboard是Apache Aries项目的一部分,它们是用于OSGi环境的Servlet容器。Pax-Web提供了Servlet 3.1兼容性,而Pax-Web-Whiteboard允许动态服务注册和发现,使得服务可以在运行时被添加到系统中。...