问题是这样的:
我的项目中有一个通用实体类包,该包包含一个持久化单元,一个持久化单元读取类,读取关键方法为:
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("META-INF/persistence.xml");
java 项目中引用了这个实体类包,项目中也有一个持久化单元,读取的都是META-INF下面的persistence.xml
所以这个项目中包含了2个持久化单元,问题也就由此而来
我通过持久化单元读取类来读取持久化单元,本来需要读取的是项目jar包的持久化单元文件,但实际上读取的是通用实体类包内的持久化单元,所以读取的是错误的
如果把通用实体类包内的持久化单元删除,那么读取的就是项目jar包内的持久化单元
怎么样才能不删除通用包实体类包内的持久化单元,而真正读取的又是我想要的内容呢,请高手们指点下
5 个解决方案
#1
不明白,不是有包名分开的吗?
#2
再不行你就重写你的持久化单元,覆盖掉原来的。
#3
问题很抽象 。。。。
#4
http://topic.csdn.net/u/20100601/14/BDFFF972-00C3-4E6C-B536-D96E4679D05F.html
http://topic.csdn.net/u/20091114/14/3B3615D5-B851-4563-B9DB-74DE6AF09B49.html
都是读、写、改jar包里文件的例子。
至于你的问题,我没明白。一般描述不清的设计,我都认为是错误或不好的设计。
http://topic.csdn.net/u/20091114/14/3B3615D5-B851-4563-B9DB-74DE6AF09B49.html
都是读、写、改jar包里文件的例子。
至于你的问题,我没明白。一般描述不清的设计,我都认为是错误或不好的设计。
#5
从你的代码中可以看出,你是通过SystemClassLoader,如果你用的是Sun的jdk的话,SystemClassLoader即AppClassLoader,其parent class loader为ExtClassLoader。在查找资源的时候,采用的是与加载class相同的双亲委托模式,即他会先由最顶层的BootstrapClassLoader来查找是否存在该resource,其次为ExtClassLoader,最后为AppClassLoader。如果你的通用包实体类是由AppClassLoader加载,那你可以放置你的自己的实体包到ext目录下由ExtClassLoader进行加载,这样可以保证每次加载到的总是你自己的包。但是这个导致的问题是你的包与项目结构上的脱离。所以你的实体包也必须由AppClassLoader来加载。AppClassLoader内部有一个列表来保存他需要查找的路径,他会从该路径上依次查找你要的resource。由于你的通用包总是在你自己的包之前,所以每次先找到的总是你的通用包。这个列表的顺序是你没法自定义的,所以推荐的办法是你避免资源的重名,改个名吧。
#1
不明白,不是有包名分开的吗?
#2
再不行你就重写你的持久化单元,覆盖掉原来的。
#3
问题很抽象 。。。。
#4
http://topic.csdn.net/u/20100601/14/BDFFF972-00C3-4E6C-B536-D96E4679D05F.html
http://topic.csdn.net/u/20091114/14/3B3615D5-B851-4563-B9DB-74DE6AF09B49.html
都是读、写、改jar包里文件的例子。
至于你的问题,我没明白。一般描述不清的设计,我都认为是错误或不好的设计。
http://topic.csdn.net/u/20091114/14/3B3615D5-B851-4563-B9DB-74DE6AF09B49.html
都是读、写、改jar包里文件的例子。
至于你的问题,我没明白。一般描述不清的设计,我都认为是错误或不好的设计。
#5
从你的代码中可以看出,你是通过SystemClassLoader,如果你用的是Sun的jdk的话,SystemClassLoader即AppClassLoader,其parent class loader为ExtClassLoader。在查找资源的时候,采用的是与加载class相同的双亲委托模式,即他会先由最顶层的BootstrapClassLoader来查找是否存在该resource,其次为ExtClassLoader,最后为AppClassLoader。如果你的通用包实体类是由AppClassLoader加载,那你可以放置你的自己的实体包到ext目录下由ExtClassLoader进行加载,这样可以保证每次加载到的总是你自己的包。但是这个导致的问题是你的包与项目结构上的脱离。所以你的实体包也必须由AppClassLoader来加载。AppClassLoader内部有一个列表来保存他需要查找的路径,他会从该路径上依次查找你要的resource。由于你的通用包总是在你自己的包之前,所以每次先找到的总是你的通用包。这个列表的顺序是你没法自定义的,所以推荐的办法是你避免资源的重名,改个名吧。