2012-03-01 65 views
0

我正在尝试编写一个小型应用程序以在本地H2数据库上使用DataNucleus的JDO实现。我首先删除任何现有的H2数据库,并用简单的连接重新创建它。JDOFatalUserException:持久性管理器已关闭

但是,我得到一个JDOFatalUserException: Persistence Manager has been closed错误,我不知道为什么。这发生在我进行第一次调用PM(在FeedDatabaseFR.java:59):

Transaction tx=DataNucleus.PM.currentTransaction(); 

这里是输出我得到:

C:/Temp/FWDB/ 
jdbc:h2:file:C:/Temp/FWDB/FWDB;MODE=MySQL 
Connection retrieved 
Connection closed 
Creating PersistenceManagerFactory 
01-mars-2012 17:30:42 org.datanucleus.store.rdbms.table.AbstractTable create 
INFO: Creating table DELETEME1330619442915 
01-mars-2012 17:30:42 org.datanucleus.store.rdbms.table.AbstractTable drop 
INFO: Dropping table DELETEME1330619442915 
01-mars-2012 17:30:42 org.datanucleus.store.rdbms.RDBMSStoreManager initialiseSchema 
INFO: Initialising Catalog "fwdb", Schema "public" using "None" auto-start option 
01-mars-2012 17:30:42 org.datanucleus.store.rdbms.RDBMSStoreManager initialiseSchema 
INFO: Catalog "fwdb", Schema "public" initialised - managing 0 classes 
01-mars-2012 17:30:42 org.datanucleus.NucleusContext logConfiguration 
INFO: ================= Persistence Configuration =============== 
01-mars-2012 17:30:42 org.datanucleus.NucleusContext logConfiguration 
INFO: DataNucleus Persistence Factory - Vendor: "DataNucleus" Version: "3.0.0.release" 
01-mars-2012 17:30:42 org.datanucleus.NucleusContext logConfiguration 
INFO: DataNucleus Persistence Factory initialised for datastore URL="jdbc:h2:file:C:/Temp/FWDB/FWDB;MODE=MySQL" driver="org.h2.Driver" userName="sa" 
01-mars-2012 17:30:42 org.datanucleus.NucleusContext logConfiguration 
INFO: =========================================================== 
PersistenceManagerFactory is not null 
Creating PersistenceManager 
01-mars-2012 17:30:42 org.datanucleus.api.jdo.metadata.JDOMetaDataManager <init> 
INFO: Registering listener for metadata initialisation 
PersistenceManager is not null 
01-mars-2012 17:30:43 org.datanucleus.api.jdo.metadata.JDOMetaDataManager$MetaDataRegisterClassListener registerClass 
INFO: Listener found initialisation for persistable class net.dwst.findword.DataNucleus.RawBeginItem 
01-mars-2012 17:30:43 org.datanucleus.api.jdo.metadata.JDOAnnotationReader processClassAnnotations 
INFO: Class "net.dwst.findword.DataNucleus.RawBeginItem" has been specified with JDO annotations so using those. 
01-mars-2012 17:30:43 org.datanucleus.store.StoreDataManager registerStoreData 
INFO: Managing Persistence of Class : net.dwst.findword.DataNucleus.RawBeginItem [Table : RAWBEGINITEM, InheritanceStrategy : new-table] 
01-mars-2012 17:30:43 org.datanucleus.store.rdbms.table.AbstractTable create 
INFO: Creating table RAWBEGINITEM 
01-mars-2012 17:30:43 org.datanucleus.api.jdo.metadata.JDOMetaDataManager$MetaDataRegisterClassListener registerClass 
INFO: Listener found initialisation for persistable class net.dwst.findword.DataNucleus.RawEndItem 
01-mars-2012 17:30:43 org.datanucleus.api.jdo.metadata.JDOAnnotationReader processClassAnnotations 
INFO: Class "net.dwst.findword.DataNucleus.RawEndItem" has been specified with JDO annotations so using those. 
01-mars-2012 17:30:43 org.datanucleus.store.StoreDataManager registerStoreData 
INFO: Managing Persistence of Class : net.dwst.findword.DataNucleus.RawEndItem [Table : RAWENDITEM, InheritanceStrategy : new-table] 
01-mars-2012 17:30:43 org.datanucleus.store.rdbms.table.AbstractTable create 
INFO: Creating table RAWENDITEM 
01-mars-2012 17:30:43 org.datanucleus.api.jdo.metadata.JDOMetaDataManager$MetaDataRegisterClassListener registerClass 
INFO: Listener found initialisation for persistable class net.dwst.findword.DataNucleus.RawContainItem 
01-mars-2012 17:30:43 org.datanucleus.api.jdo.metadata.JDOAnnotationReader processClassAnnotations 
INFO: Class "net.dwst.findword.DataNucleus.RawContainItem" has been specified with JDO annotations so using those. 
01-mars-2012 17:30:43 org.datanucleus.store.StoreDataManager registerStoreData 
INFO: Managing Persistence of Class : net.dwst.findword.DataNucleus.RawContainItem [Table : RAWCONTAINITEM, InheritanceStrategy : new-table] 
01-mars-2012 17:30:43 org.datanucleus.store.rdbms.table.AbstractTable create 
INFO: Creating table RAWCONTAINITEM 
01-mars-2012 17:30:43 org.datanucleus.api.jdo.metadata.JDOMetaDataManager$MetaDataRegisterClassListener registerClass 
INFO: Listener found initialisation for persistable class net.dwst.findword.DataNucleus.RawMadeOfItem 
01-mars-2012 17:30:43 org.datanucleus.api.jdo.metadata.JDOAnnotationReader processClassAnnotations 
INFO: Class "net.dwst.findword.DataNucleus.RawMadeOfItem" has been specified with JDO annotations so using those. 
01-mars-2012 17:30:43 org.datanucleus.store.StoreDataManager registerStoreData 
INFO: Managing Persistence of Class : net.dwst.findword.DataNucleus.RawMadeOfItem [Table : RAWMADEOFITEM, InheritanceStrategy : new-table] 
01-mars-2012 17:30:43 org.datanucleus.store.rdbms.table.AbstractTable create 
INFO: Creating table RAWMADEOFITEM 
Exception in thread "main" javax.jdo.JDOFatalUserException: Persistence Manager has been closed 
    at org.datanucleus.api.jdo.JDOPersistenceManager.assertIsOpen(JDOPersistenceManager.java:2193) 
    at org.datanucleus.api.jdo.JDOPersistenceManager.currentTransaction(JDOPersistenceManager.java:383) 
    at net.dwst.findword.FR.FeedDatabaseFR.main(FeedDatabaseFR.java:59) 

我绝对不知道为什么出现这种情况!任何人都有线索?任何人有想法建议?欢迎任何帮助!谢谢。

回答

1

经过谷歌搜索了很多,我发现this。我改变我的代码为:

PersistenceManager PM = DataNucleus.PMF.getPersistenceManager(); 
Transaction tx=PM.currentTransaction(); 

它的工作原理,但我不知道为什么。在当前的方法中如何将呼叫移动到getPersistenceManager()解决了这个问题?我不明白!如果有人有解释,欢迎!

UPDATE

我suuuuper不好,我确实关闭PM在一个循环。

相关问题