【问题标题】:Hibernate on Jboss7 OSGI (No EJB)在 Jboss7 OSGI 上休眠(无 EJB)
【发布时间】:2016-11-11 00:06:12
【问题描述】:

我使用提供HomeLocalHomeRemote 接口的实体bean 和一些无状态ejb,我在其中注入persistenceContext 并获得EntityManager

作为新要求(迁移到 Karaf),我必须摆脱所有 EJB。

我的问题是如何用简单的 DAO 类替换这个无状态 ejb 并在这些类中注入或获取实体管理器?

我的 JPA 提供程序处于休眠状态。

我需要一些示例、教程或任何类型的帮助。

【问题讨论】:

标签: java hibernate jpa osgi


【解决方案1】:

您可以使用 Apache Aries 项目:

有趣的是,您将使用蓝图,声明您的 bean 并定义一个服务(假设您想使用服务)

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:jpa="http://aries.apache.org/xmlns/jpa/v1.0.0"
           xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.0.0">

    <bean id="jpaDemo" init-method="init" class="org.demo.osgi.datasource.jpa.JpaComponentImpl">
        <jpa:context unitname="demo" property="entityManager"/>
        <tx:transaction method="*" value="Required"/>
    </bean>

    <service ref="jpaDemo" interface="org.demo.osgi.datasource.jpa.JpaComponent"/>

</blueprint>

JpaComponent 然后可以使用注入的entityManager(Scala 中的代码,但我相信你会明白的)

trait JpaComponent {

}
class JpaComponentImpl extends JpaComponent {

  val logger = org.slf4j.LoggerFactory.getLogger(classOf[JpaComponent])

  @BeanProperty
  var entityManager : EntityManager = _

  def init = {
    logger.info(s"em=${entityManager}")
  }
}

在你的包中放置一个persistence.xml(例如,META-INF/persistence.xml)。示例如下:

<persistence-unit name="demo" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/jbtravel)</jta-data-source>
    <mapping-file>META-INF/airport.xml</mapping-file>
</persistence-unit>

您将需要以下功能:

  • jpa
  • 休眠
  • jndi
  • 交易

以及以下捆绑包

  • mvn:org.apache.aries/org.apache.aries.util/1.0.1
  • mvn:org.apache.aries.jpa/org.apache.aries.jpa.api/1.0.1
  • mvn:org.apache.aries.jpa/org.apache.aries.jpa.container.context/1.0.1

另外设置以下OSGI元数据

  • 元持久性:META-INF/persistence.xml
  • 服务组件:*

请参阅https://github.com/rparree/osgi-demos/tree/master/datasource 以获取上面的示例

【讨论】:

  • 看起来在 karaf 上工作。我怎样才能让它在 JBoss 上工作? Jboss 不会从 osgi 包中注入持久性上下文。
  • 请注意,现在您指的是“JBoss 7”,但您也提到了“karaf”,这是两个不同的平台,您可能不是指 JBoss Fuse 吗? (对于 JBoss EAP 7,您不必“摆脱” ejb)
猜你喜欢
  • 2015-05-28
  • 2010-10-14
  • 1970-01-01
  • 2014-05-24
  • 2011-08-09
  • 2011-06-06
  • 2013-06-27
  • 2013-08-26
  • 2016-04-08
相关资源
最近更新 更多