java - 带有 JPA 的 AEM CQ( hibernate )

标签 java hibernate jpa osgi aem

我正在使用带有 Service Pack 1 的 Adob​​e Experience Manager (AEM) 6.4 和 Forms Package。
我有很多扩展的属性/属性,所以我做了一个数据库图。我不想在 crx 中保存所有额外的东西,我想将它保存在 Oracle 数据库中。

数据库图很复杂,所以我想至少使用 JPA( hibernate )。如果 Spring 有助于使其更易于使用,那对我来说就很好了。

我读了很多关于 OSGI 正在使用蓝图而不是 Spring,但你可以将它结合起来。

我真的在寻找一个很好的例子,如何使事情与 JPA 和 Oracle 数据库一起工作。

Adobe 根本没有帮助,他们无法展示如何使用 AEM 和 JPA/Hibernate/Spring/blueprint 的示例。

有人能帮我把事情做好吗?使用 AEM 和 JPA?

我想我需要的是:

  • persistence.xml(RESOURCE_LOCAL 还是 JTA?)
  • 带有 Annotation @Entity 和其他 JPA 注释的实体类
  • 具有事务控制的服务类和可能要提交的管理器类以与实体类一起工作并从查询中获取结果,也许我可以将它们全部放在服务类中
  • hibernate-osgi(依赖)
  • ojdbc7 用于连接(依赖项)
  • org.apache.aries.jpa.api(依赖)

  • 但我必须如何让事情发生?什么都行不通。我什至不知道这是否是正确的方法。

    我应该使用蓝图还是 Spring 或两者兼而有之?

    我从 apache 中发现了这个 Aries 的东西。
    http://aries.apache.org
    并穿着不同的 sample ,我真的不明白它们是如何工作的。
    https://github.com/apache/aries-jpa/tree/master/examples

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

    那么有人对 AEM 和 JPA 有一些经验吗?

    最佳答案

    让我描述一下它是如何在我们的项目中实现的。我们正在使用带有 SP2 的 AEM 6.3。
    我们在根 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 session 的 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-forms/configuration/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>
    

    关于java - 带有 JPA 的 AEM CQ( hibernate ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52401801/

    相关文章:

    Java:如何将这个 byte[] 反转为十六进制方法?

    java - 同时在同一个基于 Flex 的 App Engine 应用程序的 5 个版本中打开 1 个文件?

    java - DAO和Service层设计

    java - Hibernate 禁用日志记录

    hibernate - JPA 更新多行和表

    java - 如何在 Sqlite java android 中检索选择查询的结果?

    java - 使用 hibernate 和 ms sql server 驱动程序

    java - Pojo 转 Json,如果 Pojo 有内嵌对象

    java - 如何配置 Play !将 kundera 与 Cassandra 一起使用的框架项目

    java - 如何在 Spring Boot 中处理两个模型之间的多对多关系并围绕它们设计剩余调用?