Interceptors (@Transactional) on partial beans should work fine since 1.4.0.
2015-11-26 17:18 GMT+01:00 Thomas Hug <[email protected]>: > Hi Robin > > Looks good except that @RequiresTransaction is an internal marker which > probably does not work outside EntityRepositoryHandler processing (I'd have > to check again for details but that's how I remember it). Wondering if > @Transactional on the interface would work (not sure how it inherits with a > partial bean). > > Cheers, > Thomas > > On Thu, Nov 26, 2015 at 4:23 PM, Roos, Robin <[email protected]> > wrote: > > > Thomas / John, thanks for your input on this. > > > > > > > > Here is what I have so far. I must apologise I am unable to test it here > > in the UK, but will propose it to the (offshore) team if you guys don't > see > > any immediate issues. > > > > > > > > Here is the interface with the add() method: > > > > > > > > *public interface *PersistentCollection<E> { > > *void *add(E entity); > > } > > > > > > > > And the handler which implements DelegateQueryHandler and provides the > > implementation: > > > > > > > > *public class *PersistentCollectionHandler<E> *implements > *PersistentCollection<E>, DelegateQueryHandler { > > @Inject > > *private *QueryInvocationContext *context*; > > > > @RequiresTransaction > > *public void *add(E entity) { > > *context*.getEntityManager().persist(entity); > > } > > } > > > > > > > > Our project is called Whale (don’t ask), so a Repository will no longer > > extend EntityRepository directly but will instead extend WhaleRepository: > > > > > > > > *public interface *WhaleRepository<E, PK *extends *Serializable> > *extends *EntityRepository<E, PK>, PersistentCollection<E> { > > } > > > > > > > > One of our persistent Domain objects is called Family; here is that > > Repository interface now using the WhaleRepository parent: > > > > > > > > @ApplicationScoped > > @Repository > > @EntityManagerConfig(entityManagerResolver = > WhaleEntityManagerResolver.*class*) > > *public interface *FamilyRepository *extends *WhaleRepository<Family, > FamilyPK> { > > Family findByFamilyCode(String familyCode); > > } > > > > > > > > IntelliJ is happy that FamilyRepository instances now have an add(Family) > > method: > > > > > > > > > > > > So, given that I am unable actually to test, does this look feasible? > > > > > > > > Thanks again, Robin. > > > > > > > > > > > > -----Original Message----- > > From: Thomas Hug [mailto:[email protected]] > > Sent: 26 November 2015 14:50 > > To: [email protected] > > Subject: Re: Extending EntityRepository interface and > > EntityRepositoryHandler class > > > > > > > > Hi Robin > > > > > > > > Did you already look at the Query Delegates? > > > > http://deltaspike.apache.org/documentation/data.html#Extensions > > > > > > > > To summarize it for your context: > > > > - You can define a new interface with the add method > > > > - Provide an implementation of it which implements the new interface as > > well as DelegateQueryHandler. You can access the entityManager over an > > injected QueryInvocationContext (as in the docs). > > > > - Have your repositories implement / extend the new interface > > > > - Then ... No that's actually all, use the new add method :) > > > > > > > > Hope this helps. > > > > > > > > Cheers, > > > > Thomas > > > > > > > > > > > > On Thu, Nov 26, 2015 at 1:27 PM, Roos, Robin < > [email protected]> > > > > wrote: > > > > > > > > > Of course, the method would be called add() and would return > > > > > void....this is consistent with the notion that Repositories model a > > > > > persistent Collection. > > > > > > > > > > @RequiresTransaction > > > > > public void add(E entity) { > > > > > this.entityManager().persist(entity); > > > > > } > > > > > > > > > > -----Original Message----- > > > > > From: Roos, Robin [mailto:[email protected] > > <[email protected]>] > > > > > Sent: 26 November 2015 12:21 > > > > > To: [email protected] > > > > > Subject: Extending EntityRepository interface and > > > > > EntityRepositoryHandler class > > > > > > > > > > Hi Folks > > > > > > > > > > My developers are building a JPA application in which Domain objects > > > > > remain entirely within the transactional context. This means we never > > > > > do detach/merge, whether implicitly or explicitly. > > > > > > > > > > I am concerned that the default Save() implementation in > > > > > EntityRepositoryHandler would incur a merge() if an already-persistent > > > > > instance was passed to save(). > > > > > > > > > > > > > > > @RequiresTransaction > > > > > public E save(E entity) { > > > > > if(this.context.isNew(entity)) { > > > > > this.entityManager().persist(entity); > > > > > return entity; > > > > > } else { > > > > > return this.entityManager().merge(entity); > > > > > } > > > > > } > > > > > > > > > > To preclude this I would like to extend EntityRepositoryHandler to > > > > > provide an implementation of a new method add(), as follows: > > > > > > > > > > @RequiresTransaction > > > > > public E save(E entity) { > > > > > this.entityManager().persist(entity); > > > > > return entity; > > > > > } > > > > > > > > > > Presumably I would put this method signature into interface > > > > > MyEntityRepository extends EntityRepository, and the implementation > > > > > into class MyEntityRepositoryHandler extends EntityRepositoryHandler. > > > > > Repository interfaces would then implement MyEntityRepository. (We do > > > > > not have any Repository "implementations" since DeltaSpike takes care > > > > > of that for us.) > > > > > > > > > > But how do I get it all joined up, i.e. how to I nominate my new > > > > > Handler to be used when CDI is working its magic on the Repository > > interfaces? > > > > > > > > > > Thanks, Robin. > > > > > > > > > > > > > > > ********************************************************************** > > > > > ************************************* > > > > > Nissan Motor Manufacturing (UK) Limited is a limited liability company > > > > > registered in England and Wales under number 01806912 with its > > > > > registered office at Washington Road, Sunderland, Tyne and Wear SR5 > 3NS. > > > > > > > > > > CONFIDENTIALITY NOTICE AND DISCLAIMER > > > > > > > > > > This message including any attachments to it (Message) is private and > > > > > confidential and may contain proprietary or legally privileged > > > > > information. If you have received this Message in error, please send > > > > > an email to [email protected] with a copy of this > > > > > Message and remove it from your system. You must not, directly or > > > > > indirectly, use, disclose, distribute, print or copy any part of this > > > > > Message if you are not the intended recipient. The NISSAN EUROPE S.A.S > > > > > group of companies (NISSAN) reserve the right to monitor all e-mail > > communications through its networks. > > > > > > > > > > NISSAN is not liable for the proper/complete transmission or any delay > > > > > in the receipt of this Message . Whilst NISSAN takes care to protect > > > > > its systems from electronic virus attack or other harmful event, > > > > > NISSAN gives no warranty that this Message is free of any virus or > > > > > other harmful matter and accepts no liability for any loss or damage > > > > > resulting from the recipient receiving, opening or using it. > > > > > > > > > > Any views or opinions expressed in this Message are those of the > > > > > author and do not necessarily represent those of NISSAN. > > > > > > > > > > ********************************************************************** > > > > > ************************************* > > > > > > > > > > > > > > > ********************************************************************** > > > > > ************************************* > > > > > Nissan Motor Manufacturing (UK) Limited is a limited liability company > > > > > registered in England and Wales under number 01806912 with its > > > > > registered office at Washington Road, Sunderland, Tyne and Wear SR5 > 3NS. > > > > > > > > > > CONFIDENTIALITY NOTICE AND DISCLAIMER > > > > > > > > > > This message including any attachments to it (Message) is private and > > > > > confidential and may contain proprietary or legally privileged > > > > > information. If you have received this Message in error, please send > > > > > an email to [email protected] with a copy of this > > > > > Message and remove it from your system. You must not, directly or > > > > > indirectly, use, disclose, distribute, print or copy any part of this > > > > > Message if you are not the intended recipient. The NISSAN EUROPE S.A.S > > > > > group of companies (NISSAN) reserve the right to monitor all e-mail > > communications through its networks. > > > > > > > > > > NISSAN is not liable for the proper/complete transmission or any delay > > > > > in the receipt of this Message . Whilst NISSAN takes care to protect > > > > > its systems from electronic virus attack or other harmful event, > > > > > NISSAN gives no warranty that this Message is free of any virus or > > > > > other harmful matter and accepts no liability for any loss or damage > > > > > resulting from the recipient receiving, opening or using it. > > > > > > > > > > Any views or opinions expressed in this Message are those of the > > > > > author and do not necessarily represent those of NISSAN. > > > > > > > > > > ********************************************************************** > > > > > ************************************* > > > > > > > > > > > > > > > > > > > *********************************************************************************************************** > > Nissan Motor Manufacturing (UK) Limited is a limited liability company > > registered in England and Wales under number 01806912 with its registered > > office at Washington Road, Sunderland, Tyne and Wear SR5 3NS. > > > > CONFIDENTIALITY NOTICE AND DISCLAIMER > > > > This message including any attachments to it (Message) is private and > > confidential and may contain proprietary or legally privileged > > information. If you have received this Message in error, please send an > > email to [email protected] with a copy of this Message > and > > remove it from your system. You must not, directly or indirectly, use, > > disclose, distribute, print or copy any part of this Message if you are > not > > the intended recipient. The NISSAN EUROPE S.A.S group of companies > (NISSAN) > > reserve the right to monitor all e-mail communications through its > networks. > > > > NISSAN is not liable for the proper/complete transmission or any delay in > > the receipt of this Message . Whilst NISSAN takes care to protect its > > systems from electronic virus attack or other harmful event, NISSAN gives > > no warranty that this Message is free of any virus or other harmful > matter > > and accepts no liability for any loss or damage resulting from the > > recipient receiving, opening or using it. > > > > Any views or opinions expressed in this Message are those of the author > > and do not necessarily represent those of NISSAN. > > > > > *********************************************************************************************************** > > >
