Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-10, 20:48   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 MATLAB仅在前几秒钟内找到eclipselink的persistence.xml

这是在从MATLAB运行的Java代码使用eclipselink中描述的问题的继续,并且类似于Java JPA Class for MATLAB中描述的问题,但是那里描述的公认解决方案尚未完全解决问题。

我正在尝试使用eclipselink连接到matlab中的oracle数据库。从前面帖子的答案中,我将代码放在静态类路径上(在classpath.txt中)。当我这样做时,就可以使用它,但前提是必须在载入Matlab后的最初几秒钟内(通过调用Persistence.createEntityManager(...))创建EntityManager。如果我在启动Matlab之后等待5秒钟以上,则完全相同的代码将给出“未提供持久性”异常。我已经确认,它确实可以工作,但实际上它使用的是与之不同的类加载器。我唯一能想到的是,类路径是在与Matlab控制台不同的线程上初始化的,并且如果我快速运行它,则Matlab的OSGI类加载器尚未初始化,因此它使用默认的Java类加载器。

这显然不是可接受的解决方案,并且似乎还没有真正解决Matlab类加载器无法找到persistence.xml的原因。有人还有其他想法吗?可能是因为我如何初始化eclipselink?除了在我之前从事此代码工作的人,还是我除了找到将persistence.xml放在类路径的META-INF文件夹中之外,都没有办法找到它。



回答:

我找到了一个可行的解决方案,尽管我对此并不满意。首次初始化PersistenceProviderResolverHolder时,它将构造一个称为DefaultPersistenceProviderResolver的私有内部类,该类在被询问时将在您的META-INF目录中找到persistence.xml。稍后,当您调用Persistence.createEntityManagerFactory()时,它将要求PersistenceProviderResolverHolder作为解析器,然后要求解析器找到persistence.xml。

当您在Matlab中运行此程序时,问题在于在初始化过程中的某些时候,为PersistenceProviderResolverHolder提供了一个Activator类,该类可以替换默认的解析程序。据我所知,这个Activator类试图使用OSGI查找任何持久性配置。理想情况下,我应该能够进行配置,使其也可以找到persistence.xml,但是到目前为止,我还没有成功。

我想出的解决方案是制作DefaultPersistenceProviderResolver类的自己的副本,并将其实例设置为PersistenceProviderResolverHolder中的解析器。这将替换已放入其中的Activator类,并将其返回以在META-INF文件夹中查找persistence.xml。我真的不喜欢这样做,但这是我在一周的时间里就能开始工作的唯一解决方案。



更多&回答...
poster 当前离线   回复时引用此帖
回复

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 09:27


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.