I'm using jaybird 2.2.3 with hibernate 3.5 and when I use the wizard to hibernate mapping files and pojos database the following error appears "java.lang.NullPointerException"
I use the same mapping with mysql and it works correctly, so I believe it is something in jaybird
My hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.dialect">org.hibernate.dialect.FirebirdDialect</property>
<property name="hibernate.connection.driver_class">org.firebirdsql.jdbc.FBDriver</property>
<property name="hibernate.connection.url">jdbc:firebirdsql://XXXXXX:XXXX/X:\XXXX\XXXX\XXX\XXX\XX\XXX.FDB</property>
<property name="hibernate.connection.username">sysdba</property>
<property name="hibernate.connection.password">XXXXX</property>
</session-factory>
</hibernate-configuration>
Edit:
INFO [org.hibernate.cfg.Configuration]: configuring from file: hibernate.cfg.xml
INFO [org.hibernate.cfg.Configuration]: Configured SessionFactory: null
INFO [org.hibernate.cfg.reveng.OverrideRepository]: Override file: C:\Documents and Settings\micro-40\workspace\testefirebird\src\java\hibernate.reveng.xml
INFO [org.netbeans.modules.hibernate.util.HibernateUtil]: Found pre-existing database connection.
INFO [org.netbeans.modules.hibernate.util.HibernateUtil]: Database Connection is pre-established. Returning the conneciton.
INFO [org.hibernate.connection.ConnectionProviderFactory]: Initializing connection provider: org.netbeans.modules.hibernate.util.CustomJDBCConnectionProvider
INFO [org.netbeans.modules.hibernate.util.CustomJDBCConnectionProvider]: Loaded JDBC driver
INFO [org.netbeans.modules.hibernate.util.CustomJDBCConnectionProvider]: Got connection.. returning
INFO [org.netbeans.modules.hibernate.wizards.HibernateCodeGenWizardDescriptor]: access to hibernate fails.
java.lang.NullPointerException
at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:86)
at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2005)
at org.hibernate.cfg.JDBCMetaDataConfiguration.readFromJDBC(JDBCMetaDataConfiguration.java:40)
at org.netbeans.modules.hibernate.wizards.HibernateCodeGenWizardDescriptor.checkConfig(Hibernat eCodeGenWizardDescriptor.java:282)
[catch] at org.netbeans.modules.hibernate.wizards.HibernateCodeGenWizardDescriptor.isValid(HibernateCod eGenWizardDescriptor.java:177)
at org.openide.WizardDescriptor.updateStateOpen(WizardDescriptor.java:872)
at org.openide.WizardDescriptor.updateState(WizardDescriptor.java:820)
at org.openide.loaders.TemplateWizard.updateState(TemplateWizard.java:754)
at org.netbeans.modules.project.ui.NewFileWizard.updateState(NewFileWizard.java:124)
at org.openide.WizardDescriptor._updateState(WizardDescriptor.java:798)
at org.openide.WizardDescriptor.access$200(WizardDescriptor.java:90)
at org.openide.WizardDescriptor$Listener.stateChanged(WizardDescriptor.java:2094)
at org.openide.util.WeakListenerImpl$Change.stateChanged(WeakListenerImpl.java:329)
at org.openide.loaders.TemplateWizardIterImpl.run(TemplateWizardIterImpl.java:275)
at org.openide.util.Mutex.doEvent(Mutex.java:1343)
at org.openide.util.Mutex.writeAccess(Mutex.java:457)
at org.openide.loaders.TemplateWizardIterImpl.fireStateChanged(TemplateWizardIterImpl.java:261)
at org.openide.loaders.TemplateWizardIterImpl.setIterator(TemplateWizardIterImpl.java:120)
at org.openide.loaders.TemplateWizardIteratorWrapper.setIterator(TemplateWizardIteratorWrapper. java:79)
at org.openide.loaders.TemplateWizard.setTemplateImpl(TemplateWizard.java:209)
at org.openide.loaders.TemplateWizard$1.run(TemplateWizard.java:231)
at org.openide.loaders.TemplateWizard$1.run(TemplateWizard.java:228)
at org.openide.util.Mutex.doEventAccess(Mutex.java:1363)
at org.openide.util.Mutex.readAccess(Mutex.java:273)
at org.openide.loaders.TemplateWizard.setTemplate(TemplateWizard.java:228)
at org.netbeans.modules.project.ui.TemplateChooserPanel.storeSettings(TemplateChooserPanel.java :168)
at org.netbeans.modules.project.ui.TemplateChooserPanel.storeSettings(TemplateChooserPanel.java :71)
at org.openide.WizardDescriptor.storeSettingsAndNotify(WizardDescriptor.java:1379)
at org.openide.WizardDescriptor.access$1700(WizardDescriptor.java:90)
at org.openide.WizardDescriptor$Listener$1.run(WizardDescriptor.java:2117)
at org.openide.WizardDescriptor.lazyValidate(WizardDescriptor.java:1502)
at org.openide.WizardDescriptor.access$1900(WizardDescriptor.java:90)
at org.openide.WizardDescriptor$Listener.actionPerformed(WizardDescriptor.java:2141)
at sun.reflect.GeneratedMethodAccessor182.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.openide.util.WeakListenerImpl$ProxyListener.invoke(WeakListenerImpl.java:457)
at com.sun.proxy.$Proxy57.actionPerformed(Unknown Source)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:688)
at java.awt.EventQueue$3.run(EventQueue.java:686)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:702)
at java.awt.EventQueue$4.run(EventQueue.java:700)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:699)
at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:159)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:154)
at java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:182)
at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:221)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:219)
at java.awt.Dialog.show(Dialog.java:1082)
at org.netbeans.core.windows.services.NbPresenter.superShow(NbPresenter.java:1076)
at org.netbeans.core.windows.services.NbPresenter.doShow(NbPresenter.java:1126)
at org.netbeans.core.windows.services.NbPresenter.run(NbPresenter.java:1098)
at org.netbeans.core.windows.services.NbPresenter.run(NbPresenter.java:128)
at org.openide.util.Mutex.doEventAccess(Mutex.java:1363)
at org.openide.util.Mutex.readAccess(Mutex.java:273)
at org.netbeans.core.windows.services.NbPresenter.show(NbPresenter.java:1083)
at java.awt.Component.show(Component.java:1651)
at java.awt.Component.setVisible(Component.java:1603)
at java.awt.Window.setVisible(Window.java:1014)
at java.awt.Dialog.setVisible(Dialog.java:1005)
at org.netbeans.core.windows.services.DialogDisplayerImpl$1AWTQuery.showDialog(DialogDisplayerI mpl.java:260)
at org.netbeans.core.windows.services.DialogDisplayerImpl$1AWTQuery.run(DialogDisplayerImpl.jav a:186)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:727)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:688)
at java.awt.EventQueue$3.run(EventQueue.java:686)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:697)
at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:159)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
can someone help me?
After digging into the code of Netbeans and adding extra logging to Jaybird, the problem is that Netbeans loads the driver with a custom classloader that doesn't return resources in
META-INF/services
(specifically for Jaybird 2.2.x:META-INF/services/org.firebirdsql.gds.impl.GDSFactoryPlugin
).This breaks the driver as these services definitions are used to load the available
GDSFactoryPlugin
definitions (eg one for the Type 4 default implementation, Type 4 Open Office implementation, the Type 2 embedded client and Type 2 native client).I will add some kind of fallback mechanism or move this plugin definition to a separate location and also investigate why Netbeans does this, because it doesn't make a lot of sense to me.
Solution
Use Jaybird 2.2.4 or higher.
Workaround
NOTE: Do not use this workaround, it was superseded by the release of Jaybird 2.2.4
As a workaround I have released a snapshot build of Jaybird 2.2.4, you can download it from http://sourceforge.net/projects/firebird/files/firebird-jca-jdbc-driver/2.2.4-SNAPSHOT/ (make sure it has today (21st of September) as the build date, it is possible that some of the sourceforge mirrors still distribute the previous snapshot).A full list of changes in 2.2.4 can be found in the Jaybird tracker: Version 2.2.4.