Home » Eclipse Projects » Gemini » [Gemini JPA] Migration from EL OSGI to Gemini JPA
[Gemini JPA] Migration from EL OSGI to Gemini JPA [message #754776] |
Fri, 04 November 2011 09:58 |
Filipp A. Messages: 49 Registered: February 2010 |
Member |
|
|
Hi All!
After Gemini JPA 1.0 is released, I trying to migrate my RCP apps from Eclipselink OSGI to Gemini JPA, but no luck....
in my RCP app I have AbstractDaoActivator, it's look like :
import java.util.HashMap;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceUnitTransactionType;
import org.eclipse.persistence.config.PersistenceUnitProperties;
import org.eclipse.persistence.jpa.osgi.PersistenceProvider;
import org.osgi.framework.BundleActivator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
abstract public class AbstractDaoActivator implements BundleActivator, IDAO {
private static AbstractDaoActivator plugin;
/** logger for this class*/
protected static final Logger logger = LoggerFactory.getLogger(AbstractDaoActivator.class);
// JPA
private static EntityManagerFactory entityManagerFactory;
private static ThreadLocal<EntityManager> threadLocal = new ThreadLocal<EntityManager>();
private static Object lock = new Object();
private ClassLoader modelClassLoader;
private String persistenceUnitName;
public AbstractDaoActivator(ClassLoader modelClassLoader, String persistenceUnitName){
plugin = this;
this.modelClassLoader = modelClassLoader;
this.persistenceUnitName = persistenceUnitName;
}
public static AbstractDaoActivator getDefault(){
return plugin;
}
@Override
public void connect(){
initEntityManager();
}
public EntityManager getEntityManager(){
if(threadLocal.get() == null || !threadLocal.get().isOpen()){
// logger.warn("EntityManager is null or closed.... set the new one...");
threadLocal.set(entityManagerFactory.createEntityManager());
}
return threadLocal.get();
}
@Override
public void disconnect(){
//JPA
synchronized (lock) {
if (entityManagerFactory != null){
entityManagerFactory.close();
}
}
}
private void initEntityManager() {
entityManagerFactory = new PersistenceProvider().createEntityManagerFactory(persistenceUnitName, getEntityManagerProperties());
}
protected Map<String, Object> getEntityManagerProperties(){
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("javax.persistence.transactionType", PersistenceUnitTransactionType.RESOURCE_LOCAL.name());
properties.put("javax.persistence.jdbc.driver", (System.getProperty("javax.persistence.jdbc.driver") == null) ? "com.mysql.jdbc.Driver" : System.getProperty("javax.persistence.jdbc.driver"));
properties.put("javax.persistence.jdbc.url", (System.getProperty("javax.persistence.jdbc.url") == null) ? "jdbc:mysql://127.0.0.1/test" : System.getProperty("javax.persistence.jdbc.url")); // + ";create=true"
properties.put("javax.persistence.jdbc.user", (System.getProperty("javax.persistence.jdbc.user") == null) ? "test" : System.getProperty("javax.persistence.jdbc.user"));
properties.put("javax.persistence.jdbc.password", (System.getProperty("javax.persistence.jdbc.password") == null) ? "test" : System.getProperty("javax.persistence.jdbc.password"));
if(System.getProperty("wrapper.eclipselink.drop-and-create-tables").equals("yes")) {
properties.put("eclipselink.ddl-generation", "drop-and-create-tables");
}
if(System.getProperty("wrapper.eclipselink.create-tables").equals("yes")) {
properties.put("eclipselink.ddl-generation", "create-tables");
}
properties.put("eclipselink.ddl-generation.output-mode", "database");
// properties.put("eclipselink.jdbc.read-connections.min", (System.getProperty("wrapper.eclipselink.read-connections.min") == null) ? "1" : System.getProperty("wrapper.eclipselink.read-connections.min"));
properties.put("eclipselink.jdbc.write-connections.min", (System.getProperty("wrapper.eclipselink.write-connections.min") == null) ? "20" : System.getProperty("wrapper.eclipselink.write-connections.min"));
// properties.put("eclipselink.cache.shared.default", "true");
// properties.put("eclipselink.jdbc.batch-writing", "JDBC");
// ClassLoader
properties.put(PersistenceUnitProperties.CLASSLOADER, this.modelClassLoader);
// Logging
properties.put("eclipselink.logging.level", (System.getProperty("eclipselink.logging.level") == null) ? "FINEST" : System.getProperty("eclipselink.logging.level")); // OFF FINEST
properties.put("eclipselink.logging.timestamp", "true");
properties.put("eclipselink.logging.session", "true");
properties.put("eclipselink.logging.thread", "true");
properties.put("eclipselink.logging.exceptions", "true");
// Custom Sequences
properties.put("eclipselink.session.customizer", "wrapper.eclipselink.UUIDSequence");
// properties.put("eclipselink.weaving.changetracking", "false");
// properties.put("eclipselink.weaving", "true");
// properties.put("eclipselink.weaving", "dynamic");
logger.debug(properties.toString());
return properties;
}
it's work fine if I have only one persistence.xml
if I understand it right, I must change org.eclipse.persistence.jpa.osgi.PersistenceProvider to org.eclipse.gemini.jpa.provider. PersistenceProvider and I don't need to set ClassLoader any more. Is it correct ?
But, if I try to start my app only what I get, is :
[EL Warning]: 2011-11-04 10:17:09.362--Thread(Thread[Start Level Event Dispatcher,5,main])--The collection of metamodel types is empty. Model classes may not have been found during entity search for Java SE and some Java EE container managed persistence units. Please verify that your entity classes are referenced in persistence.xml using either <class> elements or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element
did i something forget?
any Ideas?
Thanks in advance!!
|
|
|
Re: [Gemini JPA] Migration from EL OSGI to Gemini JPA [message #755003 is a reply to message #754776] |
Sun, 06 November 2011 15:57 |
Filipp A. Messages: 49 Registered: February 2010 |
Member |
|
|
Problem solved !
If somebody needs, see below:
import java.util.HashMap;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.spi.PersistenceUnitTransactionType;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
import org.osgi.service.jpa.EntityManagerFactoryBuilder;
import org.osgi.util.tracker.ServiceTracker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
abstract public class AbstractDaoActivator implements BundleActivator, IDAO {
private static AbstractDaoActivator plugin;
protected static BundleContext context;
/** logger for this class*/
protected static final Logger logger = LoggerFactory.getLogger(AbstractDaoActivator.class);
// JPA
private static EntityManagerFactory entityManagerFactory;
private static ThreadLocal<EntityManager> threadLocal = new ThreadLocal<EntityManager>();
private static Object lock = new Object();
private String persistenceUnitName;
private ServiceTracker<?,?> emfTracker;
public AbstractDaoActivator(String persistenceUnitName){
plugin = this;
this.persistenceUnitName = persistenceUnitName;
}
public static AbstractDaoActivator getDefault(){
return plugin;
}
@Override
public void connect(){
EMFServiceTracker st = new EMFServiceTracker(context);
emfTracker = new ServiceTracker(context, EntityManagerFactory.class.getName(), st);
emfTracker.open();
initEntityManager();
}
public EntityManager getEntityManager(){
if(threadLocal.get() == null || !threadLocal.get().isOpen()){
// logger.warn("EntityManager is null or closed.... set the new one...");
threadLocal.set(entityManagerFactory.createEntityManager());
}
return threadLocal.get();
}
@Override
public void disconnect(){
//JPA
synchronized (lock) {
if (entityManagerFactory != null){
entityManagerFactory.close();
}
}
}
private void initEntityManager() {
EntityManagerFactoryBuilder emfb = lookupEntityManagerFactoryBuilder(persistenceUnitName);
if(emfb == null){
return;
}
entityManagerFactory = emfb.createEntityManagerFactory(getEntityManagerProperties());
}
protected Map<String, Object> getEntityManagerProperties(){
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("javax.persistence.transactionType", PersistenceUnitTransactionType.RESOURCE_LOCAL.name());
properties.put("javax.persistence.jdbc.driver", (System.getProperty("javax.persistence.jdbc.driver") == null) ? "com.mysql.jdbc.Driver" : System.getProperty("javax.persistence.jdbc.driver"));
properties.put("javax.persistence.jdbc.url", (System.getProperty("javax.persistence.jdbc.url") == null) ? "jdbc:mysql://127.0.0.1/test" : System.getProperty("javax.persistence.jdbc.url")); // + ";create=true"
properties.put("javax.persistence.jdbc.user", (System.getProperty("javax.persistence.jdbc.user") == null) ? "test" : System.getProperty("javax.persistence.jdbc.user"));
properties.put("javax.persistence.jdbc.password", (System.getProperty("javax.persistence.jdbc.password") == null) ? "test" : System.getProperty("javax.persistence.jdbc.password"));
if(System.getProperty("wrapper.eclipselink.drop-and-create-tables").equals("yes")) {
properties.put("eclipselink.ddl-generation", "drop-and-create-tables");
}
if(System.getProperty("wrapper.eclipselink.create-tables").equals("yes")) {
properties.put("eclipselink.ddl-generation", "create-tables");
}
properties.put("eclipselink.ddl-generation.output-mode", "database");
// properties.put("eclipselink.jdbc.read-connections.min", (System.getProperty("wrapper.eclipselink.read-connections.min") == null) ? "1" : System.getProperty("wrapper.eclipselink.read-connections.min"));
properties.put("eclipselink.jdbc.write-connections.min", (System.getProperty("wrapper.eclipselink.write-connections.min") == null) ? "20" : System.getProperty("wrapper.eclipselink.write-connections.min"));
// properties.put("eclipselink.cache.shared.default", "true");
// properties.put("eclipselink.jdbc.batch-writing", "JDBC");
// Logging
properties.put("eclipselink.logging.level", (System.getProperty("eclipselink.logging.level") == null) ? "FINEST" : System.getProperty("eclipselink.logging.level")); // OFF FINEST
properties.put("eclipselink.logging.timestamp", "true");
properties.put("eclipselink.logging.session", "true");
properties.put("eclipselink.logging.thread", "true");
properties.put("eclipselink.logging.exceptions", "true");
// Custom Sequences
properties.put("eclipselink.session.customizer", "wrapper.eclipselink.UUIDSequence");
// properties.put("eclipselink.weaving.changetracking", "false");
// properties.put("eclipselink.weaving", "true");
// properties.put("eclipselink.weaving", "dynamic");
logger.debug(properties.toString());
return properties;
}
public EntityManagerFactoryBuilder lookupEntityManagerFactoryBuilder(String puName) {
String filter = "(osgi.unit.name="+puName+")";
ServiceReference[] refs = null;
try {
refs = context.getServiceReferences(EntityManagerFactoryBuilder.class.getName(), filter);
} catch (InvalidSyntaxException isEx) {
new RuntimeException("Bad filter", isEx);
}
return (refs == null) ? null : (EntityManagerFactoryBuilder) context.getService(refs[0]);
}
public static EntityManagerFactory lookupEntityManagerFactory(String puName) {
String filter = "(osgi.unit.name=" + puName + ")";
ServiceReference[] refs = null;
try {
refs = context.getServiceReferences(EntityManagerFactory.class.getName(), filter);
} catch (InvalidSyntaxException isEx) {
new RuntimeException("Bad filter", isEx);
}
System.out.println("EMF Service refs looked up from registry: " + refs);
return (refs == null) ? null : (EntityManagerFactory) context.getService(refs[0]);
}
}
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.jpa.EntityManagerFactoryBuilder;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
@SuppressWarnings("rawtypes")
public class EMFServiceTracker implements ServiceTrackerCustomizer{
@SuppressWarnings("unused")
private final BundleContext context;
public EMFServiceTracker(BundleContext context) {
this.context = context;
}
@Override
public Object addingService(ServiceReference reference) {
Bundle b = reference.getBundle();
@SuppressWarnings("unchecked")
Object service = b.getBundleContext().getService(reference);
String unitName = (String) reference.getProperty(EntityManagerFactoryBuilder.JPA_UNIT_NAME);
return service;
}
@Override
public void modifiedService(ServiceReference reference, Object service) {}
@Override
public void removedService(ServiceReference reference, Object service) {}
}
and don't forget:
add bundle osgi.enterprise
put in manifest dependencies org.osgi.service.jpa, org.osgi.util.tracker
and add to model bundle manifest Meta-Persistence: and JPA-PersistenceUnits:
that's all
and one more thing, I think it's a bug, if you export for example as RAP Project and your model plugin is as jar and not as directory, your probably get java.net.MalformedURLException caused by org.eclipse.persistence.internal.jpa.deployment.PersistenceUnitProcessor.processPersistenceXML
|
|
|
Goto Forum:
Current Time: Tue Sep 24 08:44:47 GMT 2024
Powered by FUDForum. Page generated in 0.07800 seconds
|