У меня есть загрузчик классов в памяти, который я использую для загрузки 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>
Я выделить исследования, но не смогли найти ни одного примера, кто-то пытается сделать то же самое, что я хочу сделать , В основном я хочу скомпилировать и загрузить строки классов, созданные во время выполнения, без сохранения файла на диск. Впоследствии я хочу использовать эти файлы, чтобы получить запись в базе данных. (Для целей тестирования)
Я уже посмотрел на это. Мне нужно добавить много шаблонов для того, что я уже написал (я создаю объекты JPA как строки). Я нашел одну ошибку, которая была в методе getResourceAsStream(). Там не передается имя класса, а имя ресурса. Это исправило мою проблему! – eclipse
Теперь мне просто нужно выяснить, как включить плетение с этими классами, и я золотой: D – eclipse