我正在使用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合作?
我想我需要的是:
但我该如何让事情发生呢?什么都不管用。我甚至不知道这是不是正确的方式。
我应该使用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方面的经验?
有一些博客文章描述了如何在AEM/CQ中实现JPA持久性。在使用-jpa-to-write-database-applications-In-an-osgi-container-e-g-felix-or-adobe-aem-cq5时,他们描述了如何使用PersistenceUnit设置JNDI数据源,以及如何@Reference EntityManagerFactory。
我已经找到了解决方案,并在网站上发表了一篇文章。
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>
让我描述一下它是如何在我们的项目上实现的。我们正在使用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存储库保存客户和地址列表。为此我使用保存()和保存()。 但是我没有看到任何我可以从保存()和保存()中捕获任何错误的地方,以便我可以