Author: simoneg
Date: Mon Nov 15 18:52:57 2010
New Revision: 1035408
URL: http://svn.apache.org/viewvc?rev=1035408&view=rev
Log:
Hibernate JPA-DB implementation
Added:
labs/magma/trunk/database-hibernate/pom.xml
labs/magma/trunk/database-hibernate/src/
labs/magma/trunk/database-hibernate/src/main/
labs/magma/trunk/database-hibernate/src/main/java/
labs/magma/trunk/database-hibernate/src/main/java/org/
labs/magma/trunk/database-hibernate/src/main/java/org/apache/
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/OverrideAnnotations.aj
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/RegisterHibernateClasses.aj
labs/magma/trunk/database-hibernate/src/main/java/org/apache/openjpa/
labs/magma/trunk/database-hibernate/src/main/java/org/apache/openjpa/persistence/
labs/magma/trunk/database-hibernate/src/main/java/org/apache/openjpa/persistence/ElementDependent.java
labs/magma/trunk/database-hibernate/src/main/resources/
labs/magma/trunk/database-hibernate/src/test/
labs/magma/trunk/database-hibernate/src/test/java/
labs/magma/trunk/database-hibernate/src/test/resources/
Added: labs/magma/trunk/database-hibernate/pom.xml
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/database-hibernate/pom.xml?rev=1035408&view=auto
==============================================================================
--- labs/magma/trunk/database-hibernate/pom.xml (added)
+++ labs/magma/trunk/database-hibernate/pom.xml Mon Nov 15 18:52:57 2010
@@ -0,0 +1,98 @@
+<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>
+ <artifactId>magma-parent</artifactId>
+ <groupId>org.apache.magma</groupId>
+ <version>3</version>
+ </parent>
+ <groupId>org.apache.magma</groupId>
+ <artifactId>database-hibernate</artifactId>
+ <version>0.0.3-SNAPSHOT</version>
+ <packaging>magma</packaging>
+ <name>Magma Database Hibernate</name>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.magma</groupId>
+ <artifactId>database-jpa</artifactId>
+ <version>0.0.3-SNAPSHOT</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jpa_3.0_spec</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-entitymanager</artifactId>
+ <version>3.5.6-Final</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-c3p0</artifactId>
+ <version>3.5.6-Final</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-ehcache</artifactId>
+ <version>3.5.6-Final</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>net.sf.ehcache</groupId>
+ <artifactId>ehcache</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>net.sf.ehcache</groupId>
+ <artifactId>ehcache-core</artifactId>
+ <version>2.0.1</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.hibernate</groupId>
+ <artifactId>hibernate-jmx</artifactId>
+ <version>3.5.6-Final</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.magma</groupId>
+ <artifactId>foundation-logging</artifactId>
+ <version>0.0.3-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+ <repositories>
+ <repository>
+ <id>jboss</id>
+ <name>JBoss</name>
+
<url>https://repository.jboss.org/nexus/content/repositories/releases/</url>
+ </repository>
+ </repositories>
+</project>
\ No newline at end of file
Added:
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/OverrideAnnotations.aj
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/OverrideAnnotations.aj?rev=1035408&view=auto
==============================================================================
---
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/OverrideAnnotations.aj
(added)
+++
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/OverrideAnnotations.aj
Mon Nov 15 18:52:57 2010
@@ -0,0 +1,11 @@
+package org.apache.magma.database.hibernate;
+
+import org.hibernate.annotations.Cascade;
+import org.hibernate.annotations.CascadeType;
+import org.apache.openjpa.persistence.ElementDependent;
+
+public aspect OverrideAnnotations {
+
+ declare @method : @ElementDependent public * *.get*() :
@Cascade(CascadeType.DELETE_ORPHAN);
+
+}
Added:
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/RegisterHibernateClasses.aj
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/RegisterHibernateClasses.aj?rev=1035408&view=auto
==============================================================================
---
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/RegisterHibernateClasses.aj
(added)
+++
labs/magma/trunk/database-hibernate/src/main/java/org/apache/magma/database/hibernate/RegisterHibernateClasses.aj
Mon Nov 15 18:52:57 2010
@@ -0,0 +1,159 @@
+package org.apache.magma.database.hibernate;
+
+import java.beans.Beans;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Properties;
+import java.util.Set;
+
+import javax.management.MBeanServer;
+import javax.management.MBeanServerFactory;
+import javax.management.ObjectName;
+import javax.persistence.Entity;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Query;
+import javax.persistence.EntityManager;
+
+import net.sf.ehcache.CacheManager;
+import net.sf.ehcache.management.ManagementService;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.ejb.HibernateEntityManagerFactory;
+import org.hibernate.jmx.StatisticsService;
+
+import javax.persistence.Persistence;
+
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.beanutils.PropertyUtils;
+import org.apache.magma.basics.MagmaException;
+import org.apache.magma.beans.BeanData;
+import org.apache.magma.beans.PropertyInfo;
+import org.apache.magma.database.openjpa.CheckJPAManager;
+import org.apache.magma.logging.MLogger;
+import org.apache.magma.settings.Settings;
+import org.apache.magma.database.openjpa.JPADatabase;
+
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+// TODO remove that "disable hibernate during tests" stuff, and find a better
way for db tests
+public aspect RegisterHibernateClasses {
+
+ Ejb3Configuration ejc = new Ejb3Configuration();
+ AtomicBoolean initing = new AtomicBoolean(false);
+ EntityManagerFactory factory = null;
+
+ before() : staticinitialization(@Entity *) {
+ if (Settings.getEnvironment().equals("test")) return;
+ Class c =
thisJoinPointStaticPart.getSignature().getDeclaringType();
+ ejc.addAnnotatedClass(c);
+ MLogger log = new MLogger();
+ log.info("Added annotated class {}", c.getName());
+ String associationCache =
Settings.get("magma.hibernate.cache_associations");
+ if (associationCache != null) {
+ BeanData bd = BeanData.getFor(c);
+ Set<String> names = bd.getPropertyNames();
+ for (String name : names) {
+ PropertyInfo pi = bd.getProperty(name);
+ if (pi.isCollection() && !pi.isJpaTransient()) {
+ try {
+ Method getter =
c.getMethod("get" + Character.toUpperCase(name.charAt(0)) + name.substring(1));
+ if
(getter.getDeclaringClass().equals(c)) {
+ String pname =
"hibernate.ejb.collectioncache." + c.getName() + "." + name;
+ if (Settings.get(pname)
== null) {
+
ejc.setProperty(pname, associationCache);
+ log.info("Set
cache {}={}", pname, associationCache);
+ }
+ }
+ } catch (Exception e) {
+ log.info("Cannot cache {}.{}
cause of exception {} finding getter", new Object[] {c.getName(), name,
e.getClass()});
+ }
+ }
+ }
+ }
+ String entitiesCache =
Settings.get("magma.hibernate.cache_entities");
+ if (entitiesCache != null) {
+ boolean root = true;
+ Class acc = c.getSuperclass();
+ while (!acc.equals(Object.class) && root) {
+ if (acc.isAnnotationPresent(Entity.class)) root
= false;
+ acc = acc.getSuperclass();
+ }
+ if (root) {
+ String pname = "hibernate.ejb.classcache." +
c.getName();
+ if (Settings.get(pname) == null) {
+ ejc.setProperty(pname, entitiesCache);
+ log.info("Set cache {}={}", pname,
associationCache);
+ }
+ }
+ }
+ }
+
+ after() returning (Query q) :
+ call(Query+ EntityManager.createQuery(..)) &&
+ within(JPADatabase) {
+ if (Settings.get("magma.hibernate.cache_queries") != null) {
+ q.setHint("org.hibernate.cacheable", "true");
+ }
+ }
+
+ EntityManagerFactory around(Map settings) :
+ call(* Persistence.createEntityManagerFactory(..)) &&
+ withincode(public EntityManagerFactory
CheckJPAManager.createFactory()) &&
+ args(.., settings) {
+ if (Settings.getEnvironment().equals("test")) return
proceed(settings);
+ if (factory != null) return factory;
+ MLogger log = new MLogger();
+ if (initing.compareAndSet(false, true)) {
+ log.info("Initing hibernate entity manager");
+ try {
+ Properties p = new Properties();
+ p.putAll(settings);
+ ejc.addProperties(p);
+ ejc.buildMappings();
+ factory = ejc.buildEntityManagerFactory();
+ log.info("Factory correctly created");
+
+ MBeanServer mbs = null;
+
+ ArrayList<MBeanServer> servers =
MBeanServerFactory.findMBeanServer(null);
+ if (servers.size() == 0) {
+ mbs =
MBeanServerFactory.createMBeanServer();
+ } else {
+ mbs = servers.get(0);
+ }
+
+ ObjectName on = new
ObjectName("Hibernate:type=statistics,application=myapp");
+
+ // Enable Hibernate JMX Statistics
+ StatisticsService statsMBean = new StatisticsService();
+ SessionFactory sf =
((HibernateEntityManagerFactory)factory).getSessionFactory();
+ statsMBean.setSessionFactory(sf);
+ statsMBean.setStatisticsEnabled(true);
+ mbs.registerMBean(statsMBean, on);
+
+
+ // Enable Ehcache JMX Statistics
+ CacheManager cacheMgr = CacheManager.getInstance();
+ ManagementService.registerMBeans(cacheMgr, mbs, true,
true, true, true);
+ } catch (Throwable e) {
+ log.error("Error initing hibernate factory", e);
+ throw new MagmaException(e, "Error inting
hibernate");
+ } finally {
+ initing.set(false);
+ log.info("Factory initialization finished");
+ }
+ } else {
+ log.info("Waiting for another thread to init hibernate
entity manager");
+ while (initing.get()) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {}
+ }
+ log.info("Other thread finished to init hibernate
entity manager");
+ }
+ return factory;
+ }
+
+}
Added:
labs/magma/trunk/database-hibernate/src/main/java/org/apache/openjpa/persistence/ElementDependent.java
URL:
http://svn.apache.org/viewvc/labs/magma/trunk/database-hibernate/src/main/java/org/apache/openjpa/persistence/ElementDependent.java?rev=1035408&view=auto
==============================================================================
---
labs/magma/trunk/database-hibernate/src/main/java/org/apache/openjpa/persistence/ElementDependent.java
(added)
+++
labs/magma/trunk/database-hibernate/src/main/java/org/apache/openjpa/persistence/ElementDependent.java
Mon Nov 15 18:52:57 2010
@@ -0,0 +1,22 @@
+package org.apache.openjpa.persistence;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+...@target(value={ElementType.METHOD,ElementType.FIELD})
+...@retention(value=RetentionPolicy.RUNTIME)
+
+/**
+ * This is a mock of the OpenJPA propietary ElementDependent annotation. It is
here to
+ * grant binary compatibility when switching from OpenJPA to Hibernate, cause
Hibernate uses
+ * Cascade(CascadeType.DELETE_ORPHAN) to express the same thing.
+ *
+ * TODO : having a magma annotation, like MagPersistent, would be great.
+ */
+public @interface ElementDependent {
+
+ public boolean value() default true;
+
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]