Configuring Seam in Java SE, with the JBoss Microcontainer
The Seam support for Hibernate and JPA requires JTA and a JCA datasource. If you are running in a non-EE environment like Tomcat or TestNG you can run these services, and Hibernate itself, in the JBoss Microcontainer.
You can even deploy the Hibernate and JPA versions of the booking example in Tomcat.
Using Hibernate and the JBoss Microcontainer
The built-in Seam component named org.jboss.seam.core.microcontainer
bootstraps the microcontainer. As before, we probably want to use a Seam managed session.
<core:microcontainer/>
<core:managed-hibernate-session name="bookingDatabase" auto-create="true"
session-factory-jndi-name="java:/bookingSessionFactory"/>
Where java:/bookingSessionFactory
is the name of the Hibernate session factory specified in hibernate.cfg.xml
.
You'll need to provide a jboss-beans.xml
file that installs JNDI, JTA, your JCA datasource and Hibernate into the microcontainer:
<?xml version="1.0" encoding="UTF-8"?>
<deployment xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:jboss:bean-deployer bean-deployer_1_0.xsd"
xmlns="urn:jboss:bean-deployer">
<bean name="Naming" class="org.jnp.server.SingletonNamingServer"/>
<bean name="TransactionManagerFactory"
class="org.jboss.seam.microcontainer.TransactionManagerFactory"/>
<bean name="TransactionManager" class="java.lang.Object">
<constructor factoryMethod="getTransactionManager">
<factory bean="TransactionManagerFactory"/>
</constructor>
</bean>
<bean name="bookingDatasourceFactory" class="org.jboss.seam.microcontainer.DataSourceFactory">
<property name="driverClass">org.hsqldb.jdbcDriver</property>
<property name="connectionUrl">jdbc:hsqldb:.</property>
<property name="userName">sa</property>
<property name="jndiName">java:/hibernateDatasource</property>
<property name="minSize">0</property>
<property name="maxSize">10</property>
<property name="blockingTimeout">1000</property>
<property name="idleTimeout">100000</property>
<property name="transactionManager"><inject bean="TransactionManager"/></property>
</bean>
<bean name="bookingDatasource" class="java.lang.Object">
<constructor factoryMethod="getDataSource">
<factory bean="bookingDatasourceFactory"/>
</constructor>
</bean>
<bean name="bookingSessionFactoryFactory"
class="org.jboss.seam.microcontainer.HibernateFactory"/>
<bean name="bookingSessionFactory" class="java.lang.Object">
<constructor factoryMethod="getSessionFactory">
<factory bean="bookingSessionFactoryFactory"/>
</constructor>
<depends>bookingDatasource</depends>
</bean>
</deployment>