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.presc...@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 >