Hi John,

I've done the change and it works perfectly :-)

Thanks very much,
Paul

On 15 December 2015 at 09:06, Paul Wills <[email protected]> wrote:

> Thanks John.
>
> Thats a simple workaround. The reason I use @Database because the code
> assist can tell me all the choices of database that I have, instead  of
> remembering all the different annotations (maybe younger programmers don't
> have many problems remembering everything).
>
> I will add @DatabaseApp and @DatabaseVault and see how it goes.
>
> Thanks again for your help and suggested workaround.
>
> Regards,
> Paul
>
> On 14 December 2015 at 23:51, John D. Ament <[email protected]> wrote:
>
>> Hi Paul,
>>
>> If I had to guess, the main reason this hasn't been fixed is because it
>> hasn't been a need.  The workaround for the issue is pretty straight
>> forward -instead of using @Database(APP) and @Database(VAULT) you use
>> dedicated qualifiers - @VaultDB and @AppDB.  I believe most people would
>> agree that this is the more correct way to do it anyways, since the
>> attribute just makes it a bit more confusing.
>>
>> I can look to see what it takes to fix 259, I would still recommend this
>> approach of a dedicated qualifier per instead of common qualifier.
>>
>> John
>>
>>
>> On Mon, Dec 14, 2015 at 8:29 AM Paul Wills <[email protected]>
>> wrote:
>>
>> > Hi Gerhard,
>> >
>> > I've been doing a lot more complicated transactional things in Spring
>> for 7
>> > years in Tomcat, so its a little frustrating to "go out on a limb"
>> against
>> > the Spring crowd to head down what I believe to be the better path (JEE
>> +
>> > CDI) only to hit problems which undermine the use of the technology (in
>> > this case Deltaspike Transactional handling).
>> >
>> > I have to deploy on Tomcat, so it looks like I have to go with OpenEJB
>> to
>> > handle the transactions correctly.
>> >
>> > Don't get me wrong, Deltaspike is an essential and great library when
>> using
>> > CDI, but it doesn't appear that this issue (DELTASPIKE-259) will be
>> > resolved any time soon.
>> >
>> > Regards,
>> > Paul
>> >
>> > On 14 December 2015 at 21:20, Gerhard Petracek <
>> [email protected]
>> > >
>> > wrote:
>> >
>> > > hi paul,
>> > >
>> > > it doesn't work due to [1].
>> > >
>> > > regards,
>> > > gerhard
>> > >
>> > > [1] https://issues.apache.org/jira/browse/DELTASPIKE-259
>> > >
>> > >
>> > >
>> > > 2015-12-14 9:59 GMT+01:00 Paul Wills <[email protected]>:
>> > >
>> > >> The EntityManager is injected into the test case like so
>> > >> @Inject @Database(Instance.APP) private EntityManager entityManager;
>> > >>
>> > >> The database producer creates entity managers for 2 database
>> instances
>> > >> (APP
>> > >> and VAULT). I originally had the getAppEntityManager() method
>> annotated
>> > >> with TransactionScoped but removing it made no difference to the
>> > flushing
>> > >> problem. All other test cases which use the entity manager work fine,
>> > but
>> > >> they are rather simple, ie no reading back from the database before
>> > >> commiting.
>> > >>
>> > >> Here is the producer for the EntityManager(s).
>> > >> ----
>> > >> @ApplicationScoped
>> > >> public class DatabaseProducer {
>> > >>     // ~---- Static Variables and Methods
>> > >> ------------------------------------------
>> > >>     private static Logger LOGGER =
>> > >> LoggerFactory.getLogger(DatabaseProducer.class);
>> > >>
>> > >>     // ~---- Instance Variables
>> > >> ----------------------------------------------------
>> > >>     @Inject @PersistenceUnitName("app") private EntityManagerFactory
>> > >> appEntityManagerFactory;
>> > >>     @Inject @PersistenceUnitName("vault") private
>> EntityManagerFactory
>> > >> vaultEntityManagerFactory;
>> > >>     private EntityManager appEntityManager;
>> > >>     private EntityManager vaultEntityManager;
>> > >>     private DataSource appDataSource;
>> > >>     private DataSource vaultDataSource;
>> > >>
>> > >>     // ~---- Public
>> > >> Interface-----------------------------------------------------
>> > >>     @Produces @PicketLink
>> > >>     private EntityManager getSecuriyEntityManager() {
>> > >>         return getAppEntityManager();
>> > >>     }
>> > >>
>> > >>     @Produces @Database(Instance.APP)
>> > >>     private EntityManager getAppEntityManager() {
>> > >>         final EntityManager em = getEntityManager(Instance.APP,
>> false);
>> > >>         em.setFlushMode(FlushModeType.AUTO);
>> > >>         return em;
>> > >>     }
>> > >>
>> > >>     @Produces @Database(Instance.VAULT)
>> > >>     private EntityManager getVaultEntityManager() {
>> > >>         return getEntityManager(Instance.VAULT, false);
>> > >>     }
>> > >>
>> > >>     private EntityManager getEntityManager(final Instance instance,
>> > final
>> > >> boolean transactionScoped) {
>> > >>         EntityManager returnValue = null;
>> > >>         switch(instance) {
>> > >>         case APP:
>> > >>             if (transactionScoped) {
>> > >>                 returnValue =
>> > >> appEntityManagerFactory.createEntityManager();
>> > >>
>> > >>             } else {
>> > >>                 if (appEntityManager == null) {
>> > >>                     appEntityManager =
>> > >> appEntityManagerFactory.createEntityManager();
>> > >>                     logDatabaseConnectionInfo(instance);
>> > >>                 }
>> > >>                 returnValue = appEntityManager;
>> > >>             }
>> > >>             break;
>> > >>
>> > >>         case VAULT:
>> > >>             if (transactionScoped) {
>> > >>                 returnValue =
>> > >> vaultEntityManagerFactory.createEntityManager();
>> > >>
>> > >>             } else {
>> > >>                 if (vaultEntityManager == null) {
>> > >>                     vaultEntityManager =
>> > >> vaultEntityManagerFactory.createEntityManager();
>> > >>                     logDatabaseConnectionInfo(instance);
>> > >>                 }
>> > >>                 returnValue = vaultEntityManager;
>> > >>             }
>> > >>             break;
>> > >>         }
>> > >>
>> > >>         return returnValue;
>> > >>     }
>> > >>
>> > >> ----
>> > >>
>> > >> Regards,
>> > >> Paul
>> > >>
>> > >> On 14 December 2015 at 16:42, Mark Struberg <[email protected]>
>> wrote:
>> > >>
>> > >> > And how is the entity manager being created?
>> > >> >
>> > >> > LieGrue,
>> > >> > Strub
>> > >> >
>> > >> > > Am 14.12.2015 um 04:25 schrieb John D. Ament <
>> [email protected]
>> > >:
>> > >> > >
>> > >> > > Paul,
>> > >> > >
>> > >> > > Could you show us what your test looks like, including how it
>> > injects
>> > >> the
>> > >> > > bean that is used here.
>> > >> > >
>> > >> > > John
>> > >> > >
>> > >> > > On Sun, Dec 13, 2015 at 10:09 PM Paul Wills <
>> > [email protected]
>> > >> >
>> > >> > > wrote:
>> > >> > >
>> > >> > >> I can confirm the Transactional annotation is being imported as
>> > >> follows
>> > >> > >>
>> > >> > >> *import*
>> org.apache.deltaspike.jpa.api.transaction.Transactional;
>> > >> > >>
>> > >> > >> Regards,
>> > >> > >>
>> > >> > >> Paul
>> > >> > >>
>> > >> > >>
>> > >> > >>> On 10 December 2015 at 15:06, Paul Wills <
>> > [email protected]>
>> > >> > wrote:
>> > >> > >>>
>> > >> > >>> Whilst the following method is called in a test case, run with
>> > >> > >>> CdiTestRunner, the entityManager.flush() call causes a
>> > >> > >>> TransactionRequiredException.
>> > >> > >>>
>> > >> > >>> @Transactional
>> > >> > >>> public void saveAndFetchUser() {
>> > >> > >>>    // Given - a new user
>> > >> > >>>    final User randomUser = createRandomUser(false);
>> > >> > >>>
>> > >> > >>>   // When - saved
>> > >> > >>>    final User savedUser = userService.saveUser(randomUser);
>> > >> > >>>    // Then - user is saved as well as history and can be
>> retrieved
>> > >> by
>> > >> > id
>> > >> > >>> and username
>> > >> > >>>    assertThat(savedUser.getRoles(), hasSize(greaterThan(0)));
>> > >> > >>>
>> > >> > >>>    entityManager.flush();  // manually flush as
>> UaiCriteriaQueries
>> > >> > >> aren't
>> > >> > >>> flushed automatically
>> > >> > >>>    final Paged<UserHistory> pagedHistory =
>> > >> > >>> findUserHistoryMostRecentFirst(randomUser.getUsername());
>> > >> > >>>    assertThat(pagedHistory.getDerivedTotal(), equalTo(1));
>> > >> > >>>    assertThat(pagedHistory.getList(), hasSize(1));
>> > >> > >>>
>> > >> > >>>    ...
>> > >> > >>> }
>> > >> > >>>
>> > >> > >>> Is this a bug, or is there another way to flush the changes to
>> the
>> > >> > >>> database?
>> > >> > >>>
>> > >> > >>> Environment:
>> > >> > >>> weld: 2.3.1.Final
>> > >> > >>> deltaspike: 1.5.1.Final
>> > >> > >>> deltaspike dependencies
>> > >> > >>>
>> > >> > >>> <dependency>
>> > >> > >>>
>> > >> > >>> <groupId>org.apache.deltaspike.modules</groupId>
>> > >> > >>>
>> > >> > >>> <artifactId>*deltaspike*-*jpa*-module-*api*</artifactId>
>> > >> > >>>
>> > >> > >>> <version>${deltaspike.version}</version>
>> > >> > >>>
>> > >> > >>> <scope>compile</scope>
>> > >> > >>>
>> > >> > >>> </dependency>
>> > >> > >>>
>> > >> > >>> <dependency>
>> > >> > >>>
>> > >> > >>> <groupId>org.apache.deltaspike.modules</groupId>
>> > >> > >>>
>> > >> > >>> <artifactId>*deltaspike*-*jpa*-module-*impl*</artifactId>
>> > >> > >>>
>> > >> > >>> <version>${deltaspike.version}</version>
>> > >> > >>>
>> > >> > >>> <scope>compile</scope>
>> > >> > >>>
>> > >> > >>> </dependency>
>> > >> > >>>
>> > >> > >>> <dependency>
>> > >> > >>>
>> > >> > >>> <groupId>org.apache.deltaspike.core</groupId>
>> > >> > >>>
>> > >> > >>> <artifactId>*deltaspike*-core-*api*</artifactId>
>> > >> > >>>
>> > >> > >>> *<version>${deltaspike.version}</version>*
>> > >> > >>>
>> > >> > >>> <scope>compile</scope>
>> > >> > >>>
>> > >> > >>> </dependency>
>> > >> > >>>
>> > >> > >>> <dependency>
>> > >> > >>>
>> > >> > >>> <groupId>org.apache.deltaspike.core</groupId>
>> > >> > >>>
>> > >> > >>> <artifactId>*deltaspike*-core-*impl*</artifactId>
>> > >> > >>>
>> > >> > >>> *<version>${deltaspike.version}</version>*
>> > >> > >>>
>> > >> > >>> <scope>compile</scope>
>> > >> > >>>
>> > >> > >>> </dependency>
>> > >> > >>>
>> > >> > >>> <dependency>
>> > >> > >>>
>> > >> > >>> <groupId>org.apache.deltaspike.cdictrl</groupId>
>> > >> > >>>
>> > >> > >>> <artifactId>*deltaspike*-*cdictrl*-weld</artifactId>
>> > >> > >>>
>> > >> > >>> <version>${deltaspike.version}</version>
>> > >> > >>>
>> > >> > >>> <scope>test</scope>
>> > >> > >>>
>> > >> > >>> </dependency>
>> > >> > >>>
>> > >> > >>> <dependency>
>> > >> > >>>
>> > >> > >>> <groupId>org.jboss.weld.se</groupId>
>> > >> > >>>
>> > >> > >>> <artifactId>weld-*se*-core</artifactId>
>> > >> > >>>
>> > >> > >>> *<version>${weld.version}</version>*
>> > >> > >>>
>> > >> > >>> <scope>test</scope>
>> > >> > >>>
>> > >> > >>> </dependency>
>> > >> > >>>
>> > >> > >>> Regards,
>> > >> > >>> Paul Wills
>> > >> > >>
>> > >> >
>> > >>
>> > >
>> > >
>> >
>>
>
>

Reply via email to