2015-07-20 3 views
1

У меня есть загрузчик классов в памяти, который я использую для загрузки JPA-Entity.In-memory ClassLoader с Eclipselink

private static class InMemoryClassLoader extends ClassLoader { 
    private final Map<String, ByteJavaFileObject> fileObjects = new HashMap<>(); 
    private final Map<String, Class<?>> cachedClasses = new HashMap<>(); 


    public InMemoryClassLoader(ClassLoader parent) { 
     super(parent); 
    } 

    @Override 
    protected Class<?> findClass(String className) throws ClassNotFoundException { 
     if (fileObjects.containsKey(className)) { 
      if (!cachedClasses.containsKey(className)) { 
       ByteJavaFileObject fileObject = fileObjects.get(className); 
       cachedClasses.put(className, defineClass(className, fileObject.getByteCode(), 0, fileObject.getByteCode().length)); 
      } 
      return cachedClasses.get(className); 
     } else { 
      return super.findClass(className); 
     } 
    } 

    @Override 
    public Class<?> loadClass(String className) throws ClassNotFoundException { 
     if (fileObjects.containsKey(className)) { 
      return findClass(className); 
     } else { 
      return super.loadClass(className); 
     } 
    } 

    @Override 
    public InputStream getResourceAsStream(String className) { 
     return new ByteArrayInputStream(fileObjects.get(className).getByteCode()); 
    } 
... 
} 

И создаю EntityManagerFactory, используя этот загрузчик классов.

Map<String, Object> properties = new HashMap<>(); 
properties.put("eclipselink.classloader", inMemoryClassLoader); 
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("pack", properties); 
entityManager = entityManagerFactory.createEntityManager(); 

Теперь, когда я пытаюсь загрузить правильно аннотированный класс заранее, а затем использовать его (entityManager.find(inMemoryClassLoader.findClass("pack.test"), 0)) я получаю следующее исключение.

java.lang.IllegalArgumentException: Unknown entity bean class: class pack.test, please verify that this class has been marked with the @Entity annotation.

Мои persistence.xml выглядит следующим образом:

<persistence-unit name="pack"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 

    <class>pack.test</class> 
    <properties> 
     ... // properties tested 
    </properties> 
</persistence-unit> 

Я выделить исследования, но не смогли найти ни одного примера, кто-то пытается сделать то же самое, что я хочу сделать , В основном я хочу скомпилировать и загрузить строки классов, созданные во время выполнения, без сохранения файла на диск. Впоследствии я хочу использовать эти файлы, чтобы получить запись в базе данных. (Для целей тестирования)

ответ

1

Не уверен, что это подходит для вашего прецедента, но вы проверили dynamic persistence в EclipseLink?

+0

Я уже посмотрел на это. Мне нужно добавить много шаблонов для того, что я уже написал (я создаю объекты JPA как строки). Я нашел одну ошибку, которая была в методе getResourceAsStream(). Там не передается имя класса, а имя ресурса. Это исправило мою проблему! – eclipse

+0

Теперь мне просто нужно выяснить, как включить плетение с этими классами, и я золотой: D – eclipse

Смежные вопросы