我正在尝试扩展我的库以进行集成Swing
,JPA
并使JPA
配置尽可能自动化(和可移植),这意味着以编程方式添加<class>
元素。(我知道它可以通过 HibernateAnnotationConfiguration
或 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
isURLCLassLoader
的子类,它允许通过覆盖查找资源和类public Enumeration<URL> findResources(String name)
。