当前位置: 首页 > 知识库问答 >
问题:

AEM CQ和JPA(Hibernate)

冯敏达
2023-03-14

我正在使用Adobe Experience Manager(AEM)6.4和Service Pack 1以及表单包。我有很多扩展属性,所以我做了一个数据库图。我不想在crx中保存所有其他内容,我想将其保存在Oracle数据库中。

数据库图很复杂,所以我想至少使用JPA(Hibernate)。如果Spring能让它更容易使用,那对我来说就没问题了。

我读了很多关于OSGI使用蓝图而不是Spring的文章,但是您可以将其结合起来。

我真的在寻找一个很好的例子,如何使用JPA和Oracle db。

Adobe根本帮不上忙,他们无法演示如何使用AEM和JPA/Hibernate/Spring/blueprint。

有人能帮我把事情做好吗?与AEM和JPA合作?

我想我需要的是:

  1. persistence.xml(RESOURCE_LOCAL还是JTA?)
  2. 带有Annoment@Entity和其他JPA注释的实体类
  3. 带有事务控制的服务类和可能的管理器类提交到实体类中,并从查询中获得结果,也许我可以把它们都放在服务类中
  4. hibernate-osgi(依赖)
  5. ojdbc7用于连接(依赖)
  6. org.apache.aries.jpa.api(依赖)

但我该如何让事情发生呢?什么都不管用。我甚至不知道这是不是正确的方式。

我应该使用blueprint还是Spring,或者两者都使用?

我在阿帕奇找到了这个白羊座的东西。http://aries.apache.org我们使用了不同的样品,我不太明白它们是如何工作的。https://github.com/apache/aries-jpa/tree/master/examples

还有一些OSGI样本,对于我的情况来说,它们看起来非常不完整。https://enroute.osgi.org/tutorial/032-tutorial_microservice-jpa.html

有没有人有AEM和JPA方面的经验?

共有3个答案

邹嘉致
2023-03-14

有一些博客文章描述了如何在AEM/CQ中实现JPA持久性。在使用-jpa-to-write-database-applications-In-an-osgi-container-e-g-felix-or-adobe-aem-cq5时,他们描述了如何使用PersistenceUnit设置JNDI数据源,以及如何@Reference EntityManagerFactory。

郗福
2023-03-14

我已经找到了解决方案,并在网站上发表了一篇文章。

https://forums.adobe.com/message/10640295#10640295

我觉得我是地球上第一个把AEM和JPA/Hibernate结合起来的人。现在,我可以检查与spring一起工作,处理事务是否有好处。

那两个投票否决这个问题的人,我相信你是adobe的--

更新:Maven依赖项。如果对依赖项有问题,则必须嵌入它们,并添加属性“Embed Transitive to true”

 <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <extensions>true</extensions>
            <inherited>true</inherited>
            <configuration>
                <instructions>
                    <Embed-Dependency>
                        *;scope=compile|runtime
                    </Embed-Dependency>
                    <Embed-Transitive>true</Embed-Transitive>
                    <Export-Package>
                        <!--TODO export packages -->

                    </Export-Package>
                    <Private-Package>todo</Private-Package>
                    <Import-Package>
                        <!-- Attention this is really sensitive!!. -->
                        *;resolution:="optional"
                    </Import-Package>
                    <Bundle-Activator>path.to.Activator</Bundle-Activator>
                </instructions>
            </configuration>
        </plugin>
万俟承望
2023-03-14

让我描述一下它是如何在我们的项目上实现的。我们正在使用AEM 6.3和SP2。我们在根pom.xml中有下一个依赖项:

    <!-- JPA -->
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.1-api</artifactId>
        <version>1.0.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.1.10.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>5.1.10.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.common</groupId>
        <artifactId>hibernate-commons-annotations</artifactId>
        <version>5.0.1.Final</version>
    </dependency>
    <dependency>
        <groupId>com.ibm.db2.jcc</groupId>
        <artifactId>db2jcc4</artifactId>
        <version>11.1</version>
        <scope>system</scope>
        <systemPath>${project.root.path}/lib/db2jcc4.jar</systemPath>
    </dependency>
    <dependency>
        <groupId>org.jboss.logging</groupId>
        <artifactId>jboss-logging</artifactId>
        <version>3.3.2.Final</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml</groupId>
        <artifactId>classmate</artifactId>
        <version>1.3.0</version>
    </dependency>
    <dependency>
        <groupId>antlr</groupId>
        <artifactId>antlr</artifactId>
        <version>2.7.7</version>
    </dependency>
    <!-- local development database -->
    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.194</version>
    </dependency>
    <!-- /JPA-->

然后我们有了提供JPA依赖关系的捆绑包和允许Hibernate会话的OSGI服务。捆绑包pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.myproject</groupId>
    <artifactId>myproject-bundles</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <artifactId>com.myproject.db</artifactId>
  <packaging>bundle</packaging>
  <name>myproject - DB bundle</name>
  <description>OSGI bundle to work with a database</description>

  <properties>
    <bundle.export>
      com.myproject.db.*,
      javax.persistence,
      org.hibernate,
      org.hibernate.cfg,
      org.hibernate.proxy,
      org.hibernate.boot.registry,
      org.hibernate.annotations,
      org.hibernate.service,
      org.hibernate.criterion,
      org.hibernate.transform
    </bundle.export>
    <bundle.import>*;resolution:=optional</bundle.import>
    <!-- Import JDBC driver dynamically -->
    <bundle.dynamic.import>com.ibm.*,javassist.util.*</bundle.dynamic.import>
    <bundle.embed>
      hibernate-jpa-2.1-api,hibernate-core,hibernate-entitymanager,hibernate-commons-annotations,jboss-logging,antlr
    </bundle.embed>
    <project.root.path>${project.basedir}/../..</project.root.path>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.hibernate.javax.persistence</groupId>
      <artifactId>hibernate-jpa-2.1-api</artifactId>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-core</artifactId>
    </dependency>
    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate-entitymanager</artifactId>
    </dependency>
    <dependency>
      <groupId>org.hibernate.common</groupId>
      <artifactId>hibernate-commons-annotations</artifactId>
    </dependency>
    <dependency>
      <groupId>org.jboss.logging</groupId>
      <artifactId>jboss-logging</artifactId>
    </dependency>
    <dependency>
      <groupId>com.ibm.db2.jcc</groupId>
      <artifactId>db2jcc4</artifactId>
    </dependency>
    <dependency>
      <groupId>antlr</groupId>
      <artifactId>antlr</artifactId>
    </dependency>
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
    </dependency>
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-annotations</artifactId>
      </dependency>
      <dependency>
          <groupId>com.fasterxml.jackson.core</groupId>
          <artifactId>jackson-databind</artifactId>
      </dependency>
      <dependency>
          <groupId>com.myproject</groupId>
          <artifactId>com.myproject.common</artifactId>
          <version>1.0-SNAPSHOT</version>
          <scope>compile</scope>
      </dependency>
  </dependencies>
</project>

在捆绑包中,我们有下一项服务:

package com.myproject.db;

import org.hibernate.Session;

public interface JPASessionFactory {
    Session openSession();

    void closeSession(Session session);
}

执行:

package com.myproject.db.impl;

import com.myproject.db.JPASessionFactory;
import org.apache.felix.scr.annotations.*;
import org.apache.sling.commons.osgi.PropertiesUtil;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;

import javax.sql.DataSource;
import java.util.Map;

@Service
@Component(metatype = true, policy = ConfigurationPolicy.REQUIRE)
@Properties({
        @Property(label = "Hibernate SQL dialect", name = Environment.DIALECT),
        @Property(label = "Show SQL", name = Environment.SHOW_SQL, boolValue = false),
        @Property(label = "Bulk ID Strategy", name = Environment.HQL_BULK_ID_STRATEGY)
})
public class JPASessionFactoryImpl implements JPASessionFactory {

    @Reference(target = "(datasource.name=myproject)")
    private DataSource dataSource;

    private SessionFactory sessionFactory;

    @Activate
    protected void activate(Map<String, Object> properties) {
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                .configure()
                .applySetting(Environment.DIALECT, PropertiesUtil.toString(properties.get(Environment.DIALECT), ""))
                .applySetting(Environment.SHOW_SQL, PropertiesUtil.toBoolean(properties.get(Environment.SHOW_SQL), false))
                .applySetting(Environment.DATASOURCE, dataSource);

        String bulkIdStrategy = PropertiesUtil.toString(properties.get(Environment.HQL_BULK_ID_STRATEGY), "");
        if (!bulkIdStrategy.isEmpty()) {
            builder.applySetting(Environment.HQL_BULK_ID_STRATEGY, bulkIdStrategy);
        }
        sessionFactory = new Configuration().buildSessionFactory(builder.build());
    }

    @Deactivate
    protected void deactivate() {
        if (sessionFactory != null) {
            sessionFactory.close();
        }
    }

    @Override
    public Session openSession() {
        return sessionFactory.openSession();
    }

    @Override
    public void closeSession(Session session) {
        if (session != null && session.isOpen()) {
            session.close();
        }
    }
}

服务的osgi配置:

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0"
          jcr:primaryType="sling:OsgiConfig"
          hibernate.dialect="org.hibernate.dialect.H2Dialect"
          hibernate.show_sql="{Boolean}true"/>

DataSourceFactory应用程序/myProject表单/配置/config.local/org.apache.sling.datasource.DataSourceFactory-localh2.xml的配置:

<?xml version="1.0" encoding="UTF-8"?>
<jcr:root xmlns:sling="http://sling.apache.org/jcr/sling/1.0" xmlns:jcr="http://www.jcp.org/jcr/1.0"
          jcr:primaryType="sling:OsgiConfig"
          datasource.name="myproject"
          driverClassName="org.h2.Driver"
          url="jdbc:h2:./myprojectlocal;AUTO_SERVER=TRUE"
          username="sa"
          password=""
          testOnBorrow="{Boolean}true"
          testOnReturn="{Boolean}true"
          testWhileIdle="{Boolean}true"
          validationQuery="SELECT 1"/>

我们还有Hibernate配置文件Hibernate。cfg。捆绑包“资源”文件夹中的xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hbm2ddl.auto">update</property>
    <property name="current_session_context_class">thread</property>
    <mapping class="com.myproject.db.Entity1"/>
    <mapping class="com.myproject.db.Entity2"/>
  </session-factory>
</hibernate-configuration>
 类似资料:
  • Spring Data JPA不是一个JPA实现,它是对数据库数据访问的抽象。我不能理解这种表达方式与JPA的实现(比如Hibernate)进行比较。在使用Spring Data JPA时,要使用CRUD操作,必须从CrudRepository接口进行扩展。但是没有Hibernate,Spring Data JPA无法独立工作,因为它无法将java对象转换为实体。但是!Hibernate还可以执行

  • 问题内容: 我有一个带有字段的实体 当我尝试使用Spring-Data-JPA更新时,我发现edit_count已经增加,但是edit_timestamp仍然保持不变。如果我手动调用SQL edit_timestamp已更新。如果我加 它没有问题。我的问题是为什么不更新@PreUpdate edit_timestamp? 问题答案: 这是一个古老的问题,但是我想我会给出一个答案,以防其他人觉得它有

  • 问题内容: 我正在尝试设置一个Spring JPA Hibernate简单示例WAR,以将其部署到Glassfish。我看到一些示例使用persistence.xml文件,而其他示例则没有。有些示例使用数据源,有些则不使用。到目前为止,我的理解是,如果我拥有以下内容,则不需要dataSource: 我可以很好地部署,但是Spring不会注入我的EntityManager。 我的applicatio

  • 问题内容: 我想使用JPA 2.0映射来自PostGIS的数据类型。我用谷歌搜索解决方案或示例,但我能找到的是JPA不支持自定义数据类型的映射。在JPA 2.0中还是这样吗?有人暗示一个例子吗? 问题答案: 我用谷歌搜索解决方案或示例,但我能找到的是,JPA不支持自定义数据类型的映射。它仍然在JPA 2.0中吗? 是。因此,您必须依赖特定的扩展。对于Hibernate,Hibernate Spat

  • 我是JavaFX的新手,我正在尝试将旧的Swing应用程序重构为JavaFX应用程序。 我还使用JPA(带有EclipseLink实现)来保存/检索数据。 所以我定义了一些带注释的POJO。 下面是我的注释POJO: TableViewControl有些问题: null

  • 我面临一个奇怪的设计问题,我正在设计一个在线应用程序作为学习的一部分。它有一个客户实体和一个地址实体。客户内部有一组地址实体(一对多),地址有一个对客户的引用(多对一)。现在,当客户注册时,他通过Rest服务通过json传递他的详细信息以及地址集。我需要使用CRUD存储库保存客户和地址列表。为此我使用保存()和保存()。 但是我没有看到任何我可以从保存()和保存()中捕获任何错误的地方,以便我可以