cancel
Showing results for 
Search instead for 
Did you mean: 

2ème database avec Alfreco 5.2 et Hibernate

anakin59490
Star Contributor
Star Contributor

Bonjour,

J'ai développé un appli alfresco/angular5.

Pour des besoins vraiment spécifiques je dois créer une autre base de données afin de ne pas "polluer" la base de données Alfresco...Create custom Table 

J'aimerais donc pour ce faire utiliser des fichiers de config Spring avec Hibernate. Il y a de nombreux tutos...

Mais d'après ce que je trouve sur Internet, Alfresco aurait migré vers Ibatis 

(Alfresco et Hibernate ???? )

Aussi force est de constater qu'il a quand même encore une bibliothèque hibernate dans Tomcat/webapps/alfresco/web-inf/lib : hibernate-3.2.6-alf-20131023.jar

J'ai donc commencé par écrire le fichier de config suivant :

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"        xmlns:tx="http://www.springframework.org/schema/tx"        xmlns:jpa="http://www.springframework.org/schema/data/jpa"        xsi:schemaLocation="             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">     <tx:annotation-driven transaction-manager="transactionManager" />         <!-- Activate Spring Data JPA repository support      <jpa:repositories base-package="com.klinck.mc.repository" /> -->     <!-- 3) Declare a datasource that has pooling capabilities-->         <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">        <property name="driverClass" value="org.postgresql.Driver" />        <property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/klinck" />        <property name="user" value="postgres" />        <property name="password" value="admin" />        <!--<property name="password" value="#{cipher.decrypt('${jdbc.user.password}')}" /> -->        <!-- C3P0 Pool Properties -->        <property name="initialPoolSize" value="10" />        <property name="acquireIncrement" value="10" />        <property name="minPoolSize" value="10" />        <property name="maxPoolSize" value="200" />        <property name="maxIdleTime" value="3600" />        <property name="maxIdleTimeExcessConnections" value="300" />        <property name="unreturnedConnectionTimeout" value="3600" />        <property name="numHelperThreads" value="6" />        <property name="maxStatements" value="200" />    </bean>     <!-- 2) Declare a JPA entityManagerFactory -->    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">        <property name="packagesToScan" value="com.klinck.mc.bean" />        <!-- <property name="persistenceXmlLocation" value="classpath:META-INF/resources/hibernate/persistence.xml" /> -->        <property name="persistenceUnitName" value="hibernatePersistenceUnit" />        <property name="dataSource" ref="dataSource" />        <property name="jpaVendorAdapter" ref="hibernateVendor" />        <property name="jpaProperties">          <props>              <prop key="hibernate.hbm2ddl.auto">none</prop>             <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>             <prop key="hibernate.show_sql">true</prop>          </props>       </property>    </bean>     <!-- 4) Specify our ORM vendor -->    <bean id="hibernateVendor" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">        <property name="showSql" value="true" />    </bean>     <!-- 1) Declare a transaction manager-->    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">          <property name="entityManagerFactory" ref="entityManagerFactory" />    </bean></beans>

En ajoutant les dépendances suivantes dans le POM.xml

<dependency>        <groupId>org.springframework.data</groupId>        <artifactId>spring-data-jpa</artifactId>        <version>2.0.9.RELEASE</version>    </dependency>     <dependency>        <groupId>org.hibernate.javax.persistence</groupId>        <artifactId>hibernate-jpa-2.1-api</artifactId>        <version>1.0.2.Final</version>    </dependency>    <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager  -->    <dependency>       <groupId>org.hibernate</groupId>       <artifactId>hibernate-entitymanager</artifactId>       <version>4.2.4.Final</version>       <scope>runtime</scope>    </dependency>      <!-- https://mvnrepository.com/artifact/org.javassist/javassist -->    <dependency>        <groupId>org.javassist</groupId>        <artifactId>javassist</artifactId>        <version>3.23.1-GA</version>    </dependency>     <!-- meilleure gestion des pools de connexion -->    <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->    <dependency>        <groupId>com.mchange</groupId>        <artifactId>c3p0</artifactId>        <version>0.9.5.2</version>    </dependency>

J'ai ajouté les jars dans le répertoire tomcat/webapps/alfresco/web-inf/lib.

J'ai eu une première erreur :

1) "java.lang.NoSuchMethodError: org.hibernate.cfg.Environment.verifyProperties"

J'ai découvert que c'était dû à un problème de compatibilité :

JPA 2.0 & Hibernate 4.0.1 & Spring 3.1.1 Compatibility - Spring Forum 

J'ai donc changé la version d'hibernate (4.2.4-final)

2) puis j'ai eu l'erreur suivante :

"java.lang.NoSuchMethodError: org.hibernate.cfg.Configuration.addAnnotatedClass(Ljava/lang/ClassSmiley WinkLorg/hibernate/cfg/Configuration;"

Or cette méthode fait partie d'un package de la bibliothèque hibernate-core-4.2.4.Final.jar

J'en déduis donc qu' Alfresco utilise toujours Hibernate et qu'il y a des problème de conflit entre la version utilisée par alfresco et celle que j'utilise : 4.2.4.Final.jar

Comment régler ce problème et ainsi pouvoir créer ma deuxième base de données ?

Merci d'avance pour votre aide !! 

8 REPLIES 8

ycoulon
Employee
Employee

Bonjour,

Quelle version d'Alfresco utilisez vous ?

La version 6.0 d'Alfresco abandonne la librairie hibernate : Alfresco Community Edition 6.0 

Hibernate was completely removed from the product. The dialect detection is now part of alfresco-repository project.

Concernant votre besoin, plutôt que de rajouter cela dans Alfresco, je vous conseillerais la mise en place d'une nouvelle application à part entière gérant votre schéma. Les interactions avec le contenu stockés dans Alfresco sera possible via l'utilisation des REST API.

Cela aura pour avantager de :

  • Ne pas interférer avec le fonctionnement d'Alfresco
  • Simplifier le cycle de vie de votre nouveau service
  • De la maintenance d'Alfresco et de votre service.

Vous pouvez par exemple partir sur spring-boot comme base à votre nouveau projet.

Y.

Bonjour,

Merci pour votre réponse.

J'utilise ADF pour le Front et Alfresco 5.2 pour le Back (version alfresco platform 5.2.f pour exact).

Le problème est que ce besoin s'inscrit dans le cadre d'un nouvelle fonctionnalité (bouton sur une interface) sur un produit déjà mis en place chez nos clients. Une refonte du projet via le passage  à la version 6 n'est pas prévue pour le moment, nous garderons donc la version 5.2. Aussi nous pensions donc, soit ajouter nos propres tables dans la bdd Alfresco ou créer une nouvelle base de données (nouveau schéma) .

Quel est selon vous la meilleure façon de procéder ?

Merci d'avance,

Bonjour,

Si votre besoin requiert une base de donnée propre je resterai sur mon conseil d'un service à part entière. L'intégration avec Alfresco pourra se faire via les API Rest (ou CMIS si REST ne le permet). Les API Rest ont été introduite à partir de la 5.2 avec cet objectif de faciliter l'intégration avec de nouvelles application ou existante.

Comme vous l'avez remarqué Alfresco utilise une version ancienne d'hibernate si vous souhaitez utilisez une version plus récente cela fait une raison de plus de séparer votre application fonctionnalités d'Alfresco.

Vous aurez ainsi la main sur l'ensemble du projet sans être contraint par Alfresco et ses dépendances. Cela vous éviteras aussi de potentiellement altérer son fonctionnement.

Y.

anakin59490
Star Contributor
Star Contributor

Donc si je comprends bien,

au niveau architecture, on aurait un seul et même Front (ADF) qui communiquerait avec deux BackEnd : monappli-platform.jar + le nouveau (un nouveau sous-module maven ?) qui aurait son propre contexte Spring (notamment pour utiliser la nouvelle bdd avec hibernate).

Le nouveau BackEnd serait un war, à copier dans le répertoire webapps du Tomcat Alfresco

C'est bien ça ?

Merci d'avance

Bonjour,

Oui cela est tout à fait faisable.

Coté déploiement, un war est envisageable ou un jar executable spring-boot à votre convenance. Il peut être déployer sur le même serveur ou sur un autre tant que les communications nécessaire au bon fonctionnement sont autorisé.

Y.

Bonjour,

merci pour ces précieuses informations. Je trouve le sujet très intéressant notamment sur la possibilité d'intégrer Alfresco dans des applications WEB plus "classiques" (CRUD).

J'aurais ainsi une dernière question : Ce nouveau BackEnd peut-il faire l'objet d'un nouveau sous-module Maven du projet Alfresco existant ou doit-il faire l'objet d'un nouveau Projet à part entière ?

Je pense à l'optimisation de la maintenance et du développement ainsi qu'aux potentiels problèmes d'identification du user sur les deux BackEnd 

Merci d'avance

Je parle d'un microservice complétement à part sans lien avec le code Alfresco.

La communication avec Alfresco se faisant via des appel REST.

Libre à vous de prévoir dans cette application des points d'extension pour de future évolution.

Concernant l'identification vous pouvez vous baser sur les API login d'Alfresco et l'identification via le ALF_TICKET.

Y.

Merci beaucoup !