Hi there,

I'm trying to build an example where the datasource depends on the user. Only 
the database username and password can change.
 I'd like to create an entityManagerFactory with a map containing the username 
and password and thus using an appropriate entitymanager but it fails.

Here is the code of my session ejb 

  | @Stateless
  | @Local(value = { ContactManager.class })
  | @Remote(value = { RemoteContactManager.class })
  | 
  | public class ContactManagerBean implements 
ContactManager,RemoteContactManager {
  |     
  |     /**
  |      * Ajoute un contact
  |      */
  |     public ContactDTO addContact(ContactDTO contactDTO) {
  |             Map<String, String> env = new HashMap<String, String>();
  |             env.put("hibernate.connection.username", "test");
  |             env.put("hibernate.connection.password", "test");
  |             
  |             EntityManagerFactory emf 
=Persistence.createEntityManagerFactory("testUnit",env);
  |             
  |             
  |             EntityManager em = emf.createEntityManager();
  |             Contact contact = ContactAdapter.getContact(contactDTO);
  |             EntityTransaction tx = em.getTransaction();
  |         tx.begin();
  |             em.persist(contact);
  |             tx.commit();
  |             em.close();
  |             return ContactAdapter.getContactDTO(contact);
  |     }
  | 
  |     /**
  |      * Liste l'ensemble des contacts de la base de données
  |      */
  |     public Collection<ContactDTO> listContact() {
  |             EntityManagerFactory emf 
=Persistence.createEntityManagerFactory("testUnit");
  |             EntityManager em = emf.createEntityManager();
  |             EntityTransaction tx = em.getTransaction();
  |             tx.begin();
  |             Collection<Contact> colC=  em.createQuery("SELECT c FROM 
Contact c").getResultList();
  |             tx.commit();
  |             em.close();
  |             return ContactAdapter.getContactDTOCollection(colC);
  |     }
  | }
  | 
Here is my persistence.xml file:

  |     <persistence-unit name="testUnit" transaction-type="JTA">
  |             <jta-data-source>java:TestDS</jta-data-source>
  |             <provider>org.hibernate.ejb.HibernatePersistence</provider>
  |             <class>entity.Contact</class>
  |             <properties>
  |                     <property name="hibernate.hbm2ddl.auto" 
value="validate" />
  |                     <property name="hibernate.dialect"
  |                             
value="org.hibernate.dialect.MySQLInnoDBDialect" />
  |                     <property name="hibernate.connection.url" 
value="jdbc:mysql://localhost:3306/test" />
  |                     <property name="hibernate.connection.username" 
value="sa" />
  |                     <property name="hibernate.connection.password" value="" 
/>
  |                     <property name="hibernate.connection.driver_class" 
value="com.mysql.jdbc.Driver" />
  |                     <property name="hibernate.connection.pool_size" 
value="10" />                           
  |             </properties>
  |     </persistence-unit>     
  | 
And here is the error I get


  | ...
  | Caused by: javax.persistence.PersistenceException: 
org.hibernate.HibernateException: The chosen transaction strategy requires 
access to the JTA TransactionManager
  |     at 
org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:698)
  |     at 
org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:121)
  |     at 
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:51)
  |     at 
javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)
  |     at 
session.bean.ContactManagerBean.listContact(ContactManagerBean.java:72)
  |     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  |     at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  |     at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  |     at java.lang.reflect.Method.invoke(Method.java:585)
  |     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112)
  |     at 
org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166)
  |     at 
org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
  |     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  |     at 
org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54)
  |     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  |     at 
org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:46)
  |     at 
org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
  |     at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79)
  |     ... 81 more
  | Caused by: org.hibernate.HibernateException: The chosen transaction 
strategy requires access to the JTA TransactionManager
  |     at 
org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:329)
  |     at 
org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1218)
  |     at 
org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:691)
  | 

Can anyone can explain me how to deal with the transaction strategy?
Is there a better way to dynamically change the database user?

Thanks by advance,

Anthony


View the original post : 
http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4042499#4042499

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4042499

_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to