hibernate.default_schema setting in persistence.xml
mooktarus Jan 24, 2006 3:24 PMNow that I've deployed a collection of entity beans, reverse engineered from the database using Hibernate Tools 3.1, I'm having trouble doing a basic find operation from a stateless session bean. When I set the hibernate.show_sql option to "true" in my persistence.xml file, I noticed the SQL produced omitted my default_schema setting, however it does put a '.' before the table name. If I leave out the default_schema setting, it defaults to whatever is in the ejb3.deployer/META-INF/persistence.properties, if specified. I can't find a way to persuade Hibernate to use the default_schema setting in persistence.xml.
Environment:
JBoss 4.0.2
EJB3.0 RC3patch1
Java 1.5.0_06
Hibernate 3.1.1
JBoss IDE 1.5
Hibernate Tools 3.1
Oracle 9i Datasource
Fedora Core 3 Linux
Packaging:
myApp.ear +-- META-INF MANIFEST.MF application.xml +-- lib myApp.ejb3 myApp.par myApp.war
application.xml
<application> <display-name>My Application</display-name> <module> <java>lib/mylib.jar</java> </module> <module> <ejb>myApp.par</ejb> </module> <module> <ejb>myApp.ejb3</ejb> </module> <module> <web> <web-uri>myApp.war</web-uri> <context-root>/my-app</context-root> </web> </module> <library-directory>/lib</library-directory> </application>
ejb3.deployer/META-INF/persistence.properties
hibernate.transaction.manager_lookup_class=org.hibernate.transaction.JBossTransactionManagerLookup hibernate.connection.release_mode=after_statement hibernate.transaction.flush_before_completion=false hibernate.transaction.auto_close_session=false hibernate.query.factory_class=org.hibernate.hql.ast.ASTQueryTranslatorFactory hibernate.hbm2ddl.auto=none hibernate.cache.provider_class=org.hibernate.cache.HashtableCacheProvider # Clustered cache with TreeCache #hibernate.cache.provider_class=org.jboss.ejb3.entity.TreeCacheProviderHook #hibernate.treecache.mbean.object_name=jboss.cache:service=EJB3EntityTreeCache #hibernate.connection.datasource=java:/DefaultDS hibernate.connection.datasource=java:/LocalOracleDS hibernate.default_schema=XYZ hibernate.dialect=org.hibernate.dialect.Oracle9Dialect hibernate.jndi.java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory hibernate.jndi.java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
MyClientStub.java:
package org.ets.myapp.client; import java.rmi.RemoteException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.rmi.PortableRemoteObject; import org.ets.crater.interfaces.ItemSession; /** * File: MyClientStub.java * Package: alchemist * * @author jblackmore */ public class MyClientStub { private static Context context; /** * */ public MyClientStub(Context ctx) { super(); context = ctx; } public static ItemSession getItemSessionBean() { ItemSession item = null; try { item = (ItemSession) context.lookup(ItemSession.class.getName()); } catch (Exception e) { e.printStackTrace(); } return item; } /** * @param context The context to set. */ public static void setContext(Context context) { MyClientStub.context = context; } /** * @return Returns the context. */ public static Context getContext() { return context; } public static void main(String[] args) throws NamingException { Context context = new InitialContext(); context.addToEnvironment("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory"); context.addToEnvironment("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces"); context.addToEnvironment(Context.PROVIDER_URL, "jnp://localhost:1099"); MyClientStub.setContext(context); ItemSession itemBean = MyClientStub.getItemSessionBean(); try { itemBean.getItemData(args[0]); } catch (RemoteException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
Finally, the stateless bean, ItemSessionBean.java, savagely snipped to reveal just what I'm using...
/* * Created on Jan 20, 2006 */ package org.ets.myapp.ejb3; public @Stateless class ItemSessionBean implements ItemSession { @PersistenceContext (unitName="MyEntityManager") private EntityManager entityManager; //=emf.createEntityManager(); public ItemData getItemData(String itemCode) throws Exception { Itm itm = entityManager.find(Itm.class, itemCode); ItemData item = new ItemData(itemCode); // item.setField1(itm.getField1()); // ...details snipped... return item; } }
Now, given this configuration, I tried deploying my application twice, once with a default_schema setting in persistence.xml, once without.
persistence.xml, with default_schema
<entity-manager> <name>MyEntityManager</name> <jta-data-source>java:/LocalOracleDS</jta-data-source> <properties> <property name="hibernate.default_schema">ABC</property> <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9Dialect"/> <property name="hibernate.hbm2ddl.auto" value="none"/> <property name="hibernate.show_sql" value="true"/> </properties> </entity-manager>
Log after running client:
2006-01-24 15:00:47,867 INFO [STDOUT] Hibernate: select itm0_.ITM_CDE as ITM1_20_0_, itm0_.STMLS_ID as STMLS2_20_0_, itm0_.ITM_PRMPT_TXT as ITM3_20_0_, itm0_.ITM_RBRC_TXT as ITM4_20_0_, itm0_.ITM_ACSN_CDE as ITM5_20_0_, itm0_.ITM_PRDCTN_AVLBL_FLG as ITM6_20_0_ from .ITM itm0_ where itm0_.ITM_CDE=?
Then, after removing the default_schema setting from persistence.xml...
persistence.xml, without default_schema
<entity-manager> <name>MyEntityManager</name> <jta-data-source>java:/LocalOracleDS</jta-data-source> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9Dialect"/> <property name="hibernate.hbm2ddl.auto" value="none"/> <property name="hibernate.show_sql" value="true"/> </properties> </entity-manager>
rebuild, redeploy, rerun client...
Log after running client:
2006-01-24 15:01:56,538 INFO [STDOUT] Hibernate: select itm0_.ITM_CDE as ITM1_115_0_, itm0_.STMLS_ID as STMLS2_115_0_, itm0_.ITM_PRMPT_TXT as ITM3_115_0_, itm0_.ITM_RBRC_TXT as ITM4_115_0_, itm0_.ITM_ACSN_CDE as ITM5_115_0_, itm0_.ITM_PRDCTN_AVLBL_FLG as ITM6_115_0_ from XYZ.ITM itm0_ where itm0_.ITM_CDE=?
Is this a bug, or am I doing something wrong?
Thanks,