【发布时间】:2013-06-29 21:17:11
【问题描述】:
我正在尝试扩展我的库以集成Swing 和JPA,方法是尽可能地使JPA 配置为自动(和可移植),这意味着以编程方式添加<class> 元素。 (我知道它可以通过 Hibernate 的 AnnotationConfiguration 或 EclipseLInk 的 ServerSession 来完成,但是 - 可移植性)。我还想避免将Spring 仅用于这个单一目的。
我可以即时创建一个persistence.xml,并用指定包中的<class> 元素填充它(通过反射库)。当我尝试将此persistence.xml 提供给JPA 提供程序时,问题就开始了。我能想到的唯一方法是设置URLClassLoader,但我想不出一种方法不会让我首先将文件写入磁盘的某个地方,因为只有能够获得有效的URL。设置一个套接字以通过URL(localhost:xxxx) 提供文件似乎......我不知道,邪恶?
有人知道我该如何解决这个问题吗?我知道避免使用一个库听起来需要做很多工作,但我想知道是否可以这样做。
编辑(尝试更清晰):
动态生成的XML 保存在String 对象中。我不知道如何将它提供给持久性提供者。另外,我想避免将文件写入磁盘。
就我的问题而言,持久性提供程序只是一个扫描类路径以查找META-INF/persistence.xml 的类。一些实现可以接受动态创建XML,但没有通用接口(特别是对于文件的关键部分,<class> 标签)。
我的想法是设置一个自定义 ClassLoader - 如果您有任何其他的,我将不胜感激,我没有设置这个。
我能找到的唯一一个易于扩展/可配置的是URLClassLoader。它适用于URL 对象,我不知道是否可以在不先将 XML 实际写入磁盘的情况下创建一个。
这就是我设置的方式,但它通过将persistenceXmlFile = new File("META-INF/persistence.xml") 写入磁盘来工作:
Thread.currentThread().setContextClassLoader(
new URLResourceClassLoader(
new URL[] { persistenceXmlFile.toURI().toURL() },
Thread.currentThread().getContextClassLoader()
)
);
URLResourceClassLoader 是URLCLassLoader 的子类,它允许通过覆盖public Enumeration<URL> findResources(String name) 来查找资源和类。
【问题讨论】:
-
您的意思是"memory mapped",还是“仅存在于内存中的对象”?
-
我也想知道这是否可能,因为内存被认为是每个进程私有的......
-
您使用的代码是什么?为什么它必须是 URL?如果您要显示代码,我们可能会提出一个很好地接受一些通用
Resource或类似的解决方案。 -
@MattBall 抱歉,我的意思是“仅存在于内存中的对象”。如果可能的话,我只是不想写入磁盘。
-
@yair 我不必是 URL。我正在寻找一种方法来提供一个使用文件扫描类路径的类 - 而无需实际将文件写入磁盘。
标签: java jpa classloader