Hibernate and JPA with Griffon
04 January, 2010
Whilst tradional GORM is forthcoming and there is a preview release of the MongoDB plugin with some GORM-like features, there might be a reason why you might need to use Hibernate but not GORM. You might want to slowly evolve an application and work inward from the Swing bits. Using Guice and the warp-persist extension, you can quickly wire Hibernate support into a Griffon application.
I started with the warp-persist-samples DAO example located here and copied all the source files to the Griffon app. It demonstrates normal pre-GORM data persistence patterns with a data access object for each data type.
I put the persistence.xml file into the resources/META-INF directory of the Griffon application and the following in my controller to instantiate the Guice injector and connections to the database (after creating the projectClient object in the model:
model.projectClient = Guice.createInjector( new MainModule(), PersistenceService.usingJpa().across(UnitOfWork.TRANSACTION) .transactedWith(TransactionStrategy.LOCAL).forAll( Matchers.any()).buildModule()).getInstance( TestClient.class); model.projectClient.go();
warp-persist uses guice 1.0 and the griffon plugin uses 2.0 so the plugin isn't needed to enable Hibernate support. While the resulting application lacks GUI interaction, it shows how quickly basic Hibernate support can be added and why that is no longer a barrier to Griffon adoption.
Comments
-
kimukou_26
said:
I thank for an article but i have a question
my Environment
OS:XPSP3
griffon:0.3.0
groovy:1.7.3
require import sentence addition controller
----start----
import org.rapin.module.MainModule
import org.rapin.client.TestClient
import com.google.inject.Guice
import com.google.inject.matcher.*
import com.wideplay.warp.persist.*
----end----
after [griffon run-app] Exception cause
A reason is most suitable default sample data not exist ?
Or Will it be an automatic generated thing ?
----start----
log4j:WARN No appenders could be found for logger (org.hibernate.ejb.Version).
log4j:WARN Please initialize the log4j system properly.
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.google.inject.ConstructorInjector.construct(ConstructorInjector.java:161)
at com.google.inject.InjectorImpl$ImplicitBinding.get(InjectorImpl.java:1006)
at com.google.inject.ProviderToInternalFactoryAdapter$1.call(ProviderToInternalFactoryAdapter.java:37)
at com.google.inject.InjectorImpl.callInContext(InjectorImpl.java:756)
at com.google.inject.ProviderToInternalFactoryAdapter.get(ProviderToInternalFactoryAdapter.java:35)
at com.google.inject.Scopes$1$1.get(Scopes.java:53)
at com.google.inject.InternalFactoryToProviderAdapter.get(InternalFactoryToProviderAdapter.java:41)
at com.google.inject.BindingBuilderImpl$ImplicitImplementation.get(BindingBuilderImpl.java:334)
at com.google.inject.BinderImpl$BindingPreloader.call(BinderImpl.java:486)
at com.google.inject.BinderImpl$BindingPreloader.call(BinderImpl.java:471)
at com.google.inject.BinderImpl$3.call(BinderImpl.java:310)
at com.google.inject.BinderImpl$3.call(BinderImpl.java:308)
at com.google.inject.InjectorImpl.callInContext(InjectorImpl.java:747)
at com.google.inject.BinderImpl.runPreloaders(BinderImpl.java:307)
at com.google.inject.BinderImpl.createInjector(BinderImpl.java:298)
at com.google.inject.Guice.createInjector(Guice.java:79)
at com.google.inject.Guice.createInjector(Guice.java:53)
at com.google.inject.Guice.createInjector(Guice.java:43)
at DTagSendorController.mvcGroupInit(DTagSendorController.groovy:20)
at DTagSendorController$mvcGroupInit.call(Unknown Source)
at griffon.util.GriffonApplicationHelper$_buildMVCGroup_closure8.doCall(GriffonApplicationHelper.groovy:294)
at griffon.util.GriffonApplicationHelper.buildMVCGroup(GriffonApplicationHelper.groovy:281)
at griffon.util.GriffonApplicationHelper$buildMVCGroup.callStatic(Unknown Source)
at griffon.util.GriffonApplicationHelper.createMVCGroup(GriffonApplicationHelper.groovy:192)
at griffon.util.GriffonApplicationHelper$createMVCGroup$0.callStatic(Unknown Source)
at griffon.util.GriffonApplicationHelper.createMVCGroup(GriffonApplicationHelper.groovy:172)
at griffon.util.GriffonApplicationHelper$createMVCGroup.callStatic(Unknown Source)
at griffon.util.GriffonApplicationHelper$_startup_closure3.doCall(GriffonApplicationHelper.groovy:97)
at griffon.util.GriffonApplicationHelper.startup(GriffonApplicationHelper.groovy:96)
at griffon.util.GriffonApplicationHelper$startup.call(Unknown Source)
at griffon.application.SwingApplication.realize(SwingApplication.groovy:50)
at griffon.application.StandaloneGriffonApplication$realize.call(Unknown Source)
at griffon.application.SwingApplication.main(SwingApplication.groovy:103)
Caused by: java.lang.reflect.InvocationTargetException
at org.rapin.app.InitializerJpa$$FastClassByGuice$$2109e2d8.newInstance(
) at com.google.inject.cglib.reflect.FastConstructor.newInstance(FastConstructor.java:40) at com.google.inject.DefaultConstructionProxyFactory$2.newInstance(DefaultConstructionProxyFactory.java:67) at com.google.inject.ConstructorInjector.construct(ConstructorInjector.java:142) ... 32 more Caused by: javax.persistence.PersistenceException: org.hibernate.HibernateException: Hibernate Dialect must be explicitly set at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:698) at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:121) at com.wideplay.warp.jpa.JpaPersistenceService.start(Unknown Source) at org.rapin.app.InitializerJpa. (InitializerJpa.java:31) ... 36 more Caused by: org.hibernate.HibernateException: Hibernate Dialect must be explicitly set at org.hibernate.dialect.DialectFactory.determineDialect(DialectFactory.java:57) at org.hibernate.dialect.DialectFactory.buildDialect(DialectFactory.java:39) at org.hibernate.cfg.SettingsFactory.determineDialect(SettingsFactory.java:409) at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:119) at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2006) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1289) at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:691) ... 39 more ----end----