You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Michael Prescott <mi...@gmail.com> on 2012/07/20 21:19:45 UTC
Tapestry-Hibernate Configuration Woes - The user must supply a JDBC connection
I'm having trouble getting a connection through tapestry-hibernate. Any
help would be appreciated! I imagine I'm not seeing some small thing I've
overlooked.
I'm configuring the hibernate connection in code, to use a DataSource
provided by the servlet container.
The data source is available - I can tell, because I'm using it in my
tapestry module to run Flyway database migration scripts, which do modify
the database - but any tapestry-hibernate action (e.g. invoking a method on
a DAO) produces:
*java.lang.UnsupportedOperationException*
*The user must supply a JDBC connection*
-
org.hibernate.connection.UserSuppliedConnectionProvider.getConnection(UserSuppliedConnectionProvider.java:54)
-
org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
-
org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
- org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:160)
-
org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:81)
- org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)
-
org.apache.tapestry5.internal.hibernate.HibernateSessionManagerImpl.startNewTransaction(HibernateSessionManagerImpl.java:38)
-
org.apache.tapestry5.internal.hibernate.HibernateSessionManagerImpl.<init>(HibernateSessionManagerImpl.java:33)
- ...
Attached are the relevant lines out of my module:
public void contributeApplicationDefaults(
MappedConfiguration<String, String> configuration) {
// There's no hibernate.cfg.xml file
configuration.add(HibernateSymbols.DEFAULT_CONFIGURATION, "false");
}
@EagerLoad
public DatabaseMigrator buildDatabaseMigrator() {
DataSource dataSource = (DataSource) lookup(datasourceName);
FlywayDatabaseMigrator migrator = new FlywayDatabaseMigrator(dataSource);
migrator.updateDatabase();
return migrator;
}
public void contributeHibernateSessionSource(
OrderedConfiguration<HibernateConfigurer> config) {
HibernateConfigurer hibernateConfigurer = new HibConfig(datasourceName);
config.add("hibconfig", hibernateConfigurer);
}
public void contributeHibernateEntityPackageManager(
Configuration<String> configuration) {
// Specifies the package
configuration.add("com.tsg.configtool.domain");
}
private static final class HibConfig implements HibernateConfigurer {
private String datasourceName;
HibConfig(String datasourceName) {
this.datasourceName = datasourceName;
}
@Override
public void configure(org.hibernate.cfg.Configuration configuration) {
configuration.setProperty("hibernate.dialect", DB_DIALECT);
configuration.setProperty("connection.datasource", datasourceName);
}
}
private Object lookup(String resourceName) {
try {
return new InitialContext().lookup(resourceName);
} catch (NamingException e) {
throw new RuntimeException("Unable to lookup resource \""
+ resourceName + "\".", e);
}
}
Michael
Re: Tapestry-Hibernate Configuration Woes - The user must supply a
JDBC connection
Posted by Michael Prescott <mi...@gmail.com>.
Hah, embarrassing. Thanks very much, Alex. Glad it was something dumb and
not something complicaeted, though!
On 23 July 2012 09:10, Alex Kotchnev <ak...@gmail.com> wrote:
> It seems that you might be setting the wrong hibernate configuration
> property - at least this thread (
>
> http://stackoverflow.com/questions/5303671/configure-hibernate-to-connect-to-database-via-jndi-datasource
> )
> on stack overflow indicates that the datasource property is
> "hibernate.connection.datasource" and not "connection.datasource" .
>
> The reason your migration works is that you manually look up the
> datasource.
>
> Cheers,
>
> Alex K
>
>
>
> On Fri, Jul 20, 2012 at 4:17 PM, Michael Prescott <
> michael.r.prescott@gmail.com> wrote:
>
> > The problem goes away if I provide a hibernate.cfg.xml file with all the
> > database connection properties, and set
> > HibernateSymbols.DEFAULT_CONFIGURATION to true.
> >
> > So I suppose my question is:
> >
> > What do I need to do to get rid of the hibernate.cfg.xml file? I need to
> > have my application use a data source whose name is itself specified by
> the
> > container. I can inject the name just fine, but my HibConfig class
> doesn't
> > seem to be cutting the mustard.
> >
> > Michael
> >
> > On 20 July 2012 15:19, Michael Prescott <michael.r.prescott@gmail.com
> > >wrote:
> >
> > > I'm having trouble getting a connection through tapestry-hibernate.
> Any
> > > help would be appreciated! I imagine I'm not seeing some small thing
> > I've
> > > overlooked.
> > >
> > > I'm configuring the hibernate connection in code, to use a DataSource
> > > provided by the servlet container.
> > >
> > > The data source is available - I can tell, because I'm using it in my
> > > tapestry module to run Flyway database migration scripts, which do
> modify
> > > the database - but any tapestry-hibernate action (e.g. invoking a
> method
> > on
> > > a DAO) produces:
> > >
> > > *java.lang.UnsupportedOperationException*
> > > *The user must supply a JDBC connection*
> > >
> > > -
> > >
> >
> org.hibernate.connection.UserSuppliedConnectionProvider.getConnection(UserSuppliedConnectionProvider.java:54)
> > > -
> > >
> >
> org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
> > > -
> > >
> >
> org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
> > > - org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:160)
> > > -
> > >
> > org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:81)
> > > -
> > >
> org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)
> > > -
> > >
> >
> org.apache.tapestry5.internal.hibernate.HibernateSessionManagerImpl.startNewTransaction(HibernateSessionManagerImpl.java:38)
> > > -
> > >
> >
> org.apache.tapestry5.internal.hibernate.HibernateSessionManagerImpl.<init>(HibernateSessionManagerImpl.java:33)
> > > - ...
> > >
> > > Attached are the relevant lines out of my module:
> > >
> > >
> > > public void contributeApplicationDefaults(
> > > MappedConfiguration<String, String> configuration) {
> > >
> > > // There's no hibernate.cfg.xml file
> > > configuration.add(HibernateSymbols.DEFAULT_CONFIGURATION, "false");
> > > }
> > >
> > > @EagerLoad
> > > public DatabaseMigrator buildDatabaseMigrator() {
> > > DataSource dataSource = (DataSource) lookup(datasourceName);
> > > FlywayDatabaseMigrator migrator = new
> FlywayDatabaseMigrator(dataSource);
> > > migrator.updateDatabase();
> > > return migrator;
> > > }
> > >
> > > public void contributeHibernateSessionSource(
> > > OrderedConfiguration<HibernateConfigurer> config) {
> > >
> > > HibernateConfigurer hibernateConfigurer = new
> HibConfig(datasourceName);
> > >
> > > config.add("hibconfig", hibernateConfigurer);
> > > }
> > >
> > > public void contributeHibernateEntityPackageManager(
> > > Configuration<String> configuration) {
> > > // Specifies the package
> > > configuration.add("com.tsg.configtool.domain");
> > > }
> > >
> > > private static final class HibConfig implements HibernateConfigurer {
> > > private String datasourceName;
> > >
> > > HibConfig(String datasourceName) {
> > > this.datasourceName = datasourceName;
> > > }
> > >
> > > @Override
> > > public void configure(org.hibernate.cfg.Configuration configuration) {
> > > configuration.setProperty("hibernate.dialect", DB_DIALECT);
> > > configuration.setProperty("connection.datasource", datasourceName);
> > > }
> > > }
> > >
> > > private Object lookup(String resourceName) {
> > > try {
> > > return new InitialContext().lookup(resourceName);
> > > } catch (NamingException e) {
> > > throw new RuntimeException("Unable to lookup resource \""
> > > + resourceName + "\".", e);
> > > }
> > > }
> > >
> > >
> > >
> > > Michael
> > >
> >
>
Re: Tapestry-Hibernate Configuration Woes - The user must supply a
JDBC connection
Posted by Alex Kotchnev <ak...@gmail.com>.
It seems that you might be setting the wrong hibernate configuration
property - at least this thread (
http://stackoverflow.com/questions/5303671/configure-hibernate-to-connect-to-database-via-jndi-datasource
)
on stack overflow indicates that the datasource property is
"hibernate.connection.datasource" and not "connection.datasource" .
The reason your migration works is that you manually look up the
datasource.
Cheers,
Alex K
On Fri, Jul 20, 2012 at 4:17 PM, Michael Prescott <
michael.r.prescott@gmail.com> wrote:
> The problem goes away if I provide a hibernate.cfg.xml file with all the
> database connection properties, and set
> HibernateSymbols.DEFAULT_CONFIGURATION to true.
>
> So I suppose my question is:
>
> What do I need to do to get rid of the hibernate.cfg.xml file? I need to
> have my application use a data source whose name is itself specified by the
> container. I can inject the name just fine, but my HibConfig class doesn't
> seem to be cutting the mustard.
>
> Michael
>
> On 20 July 2012 15:19, Michael Prescott <michael.r.prescott@gmail.com
> >wrote:
>
> > I'm having trouble getting a connection through tapestry-hibernate. Any
> > help would be appreciated! I imagine I'm not seeing some small thing
> I've
> > overlooked.
> >
> > I'm configuring the hibernate connection in code, to use a DataSource
> > provided by the servlet container.
> >
> > The data source is available - I can tell, because I'm using it in my
> > tapestry module to run Flyway database migration scripts, which do modify
> > the database - but any tapestry-hibernate action (e.g. invoking a method
> on
> > a DAO) produces:
> >
> > *java.lang.UnsupportedOperationException*
> > *The user must supply a JDBC connection*
> >
> > -
> >
> org.hibernate.connection.UserSuppliedConnectionProvider.getConnection(UserSuppliedConnectionProvider.java:54)
> > -
> >
> org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
> > -
> >
> org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
> > - org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:160)
> > -
> >
> org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:81)
> > -
> > org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)
> > -
> >
> org.apache.tapestry5.internal.hibernate.HibernateSessionManagerImpl.startNewTransaction(HibernateSessionManagerImpl.java:38)
> > -
> >
> org.apache.tapestry5.internal.hibernate.HibernateSessionManagerImpl.<init>(HibernateSessionManagerImpl.java:33)
> > - ...
> >
> > Attached are the relevant lines out of my module:
> >
> >
> > public void contributeApplicationDefaults(
> > MappedConfiguration<String, String> configuration) {
> >
> > // There's no hibernate.cfg.xml file
> > configuration.add(HibernateSymbols.DEFAULT_CONFIGURATION, "false");
> > }
> >
> > @EagerLoad
> > public DatabaseMigrator buildDatabaseMigrator() {
> > DataSource dataSource = (DataSource) lookup(datasourceName);
> > FlywayDatabaseMigrator migrator = new FlywayDatabaseMigrator(dataSource);
> > migrator.updateDatabase();
> > return migrator;
> > }
> >
> > public void contributeHibernateSessionSource(
> > OrderedConfiguration<HibernateConfigurer> config) {
> >
> > HibernateConfigurer hibernateConfigurer = new HibConfig(datasourceName);
> >
> > config.add("hibconfig", hibernateConfigurer);
> > }
> >
> > public void contributeHibernateEntityPackageManager(
> > Configuration<String> configuration) {
> > // Specifies the package
> > configuration.add("com.tsg.configtool.domain");
> > }
> >
> > private static final class HibConfig implements HibernateConfigurer {
> > private String datasourceName;
> >
> > HibConfig(String datasourceName) {
> > this.datasourceName = datasourceName;
> > }
> >
> > @Override
> > public void configure(org.hibernate.cfg.Configuration configuration) {
> > configuration.setProperty("hibernate.dialect", DB_DIALECT);
> > configuration.setProperty("connection.datasource", datasourceName);
> > }
> > }
> >
> > private Object lookup(String resourceName) {
> > try {
> > return new InitialContext().lookup(resourceName);
> > } catch (NamingException e) {
> > throw new RuntimeException("Unable to lookup resource \""
> > + resourceName + "\".", e);
> > }
> > }
> >
> >
> >
> > Michael
> >
>
Re: Tapestry-Hibernate Configuration Woes - The user must supply a
JDBC connection
Posted by Michael Prescott <mi...@gmail.com>.
The problem goes away if I provide a hibernate.cfg.xml file with all the
database connection properties, and set
HibernateSymbols.DEFAULT_CONFIGURATION to true.
So I suppose my question is:
What do I need to do to get rid of the hibernate.cfg.xml file? I need to
have my application use a data source whose name is itself specified by the
container. I can inject the name just fine, but my HibConfig class doesn't
seem to be cutting the mustard.
Michael
On 20 July 2012 15:19, Michael Prescott <mi...@gmail.com>wrote:
> I'm having trouble getting a connection through tapestry-hibernate. Any
> help would be appreciated! I imagine I'm not seeing some small thing I've
> overlooked.
>
> I'm configuring the hibernate connection in code, to use a DataSource
> provided by the servlet container.
>
> The data source is available - I can tell, because I'm using it in my
> tapestry module to run Flyway database migration scripts, which do modify
> the database - but any tapestry-hibernate action (e.g. invoking a method on
> a DAO) produces:
>
> *java.lang.UnsupportedOperationException*
> *The user must supply a JDBC connection*
>
> -
> org.hibernate.connection.UserSuppliedConnectionProvider.getConnection(UserSuppliedConnectionProvider.java:54)
> -
> org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
> -
> org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
> - org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:160)
> -
> org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:81)
> -
> org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)
> -
> org.apache.tapestry5.internal.hibernate.HibernateSessionManagerImpl.startNewTransaction(HibernateSessionManagerImpl.java:38)
> -
> org.apache.tapestry5.internal.hibernate.HibernateSessionManagerImpl.<init>(HibernateSessionManagerImpl.java:33)
> - ...
>
> Attached are the relevant lines out of my module:
>
>
> public void contributeApplicationDefaults(
> MappedConfiguration<String, String> configuration) {
>
> // There's no hibernate.cfg.xml file
> configuration.add(HibernateSymbols.DEFAULT_CONFIGURATION, "false");
> }
>
> @EagerLoad
> public DatabaseMigrator buildDatabaseMigrator() {
> DataSource dataSource = (DataSource) lookup(datasourceName);
> FlywayDatabaseMigrator migrator = new FlywayDatabaseMigrator(dataSource);
> migrator.updateDatabase();
> return migrator;
> }
>
> public void contributeHibernateSessionSource(
> OrderedConfiguration<HibernateConfigurer> config) {
>
> HibernateConfigurer hibernateConfigurer = new HibConfig(datasourceName);
>
> config.add("hibconfig", hibernateConfigurer);
> }
>
> public void contributeHibernateEntityPackageManager(
> Configuration<String> configuration) {
> // Specifies the package
> configuration.add("com.tsg.configtool.domain");
> }
>
> private static final class HibConfig implements HibernateConfigurer {
> private String datasourceName;
>
> HibConfig(String datasourceName) {
> this.datasourceName = datasourceName;
> }
>
> @Override
> public void configure(org.hibernate.cfg.Configuration configuration) {
> configuration.setProperty("hibernate.dialect", DB_DIALECT);
> configuration.setProperty("connection.datasource", datasourceName);
> }
> }
>
> private Object lookup(String resourceName) {
> try {
> return new InitialContext().lookup(resourceName);
> } catch (NamingException e) {
> throw new RuntimeException("Unable to lookup resource \""
> + resourceName + "\".", e);
> }
> }
>
>
>
> Michael
>