You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@deltaspike.apache.org by "Roos, Robin" <Ro...@ntc-europe.co.uk> on 2015/11/26 13:21:06 UTC

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.security@nissan-europe.com 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.
***********************************************************************************************************

RE: Extending EntityRepository interface and EntityRepositoryHandler class

Posted by "Roos, Robin" <Ro...@ntc-europe.co.uk>.
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:Robin.Roos@ntc-europe.co.uk] 
Sent: 26 November 2015 12:21
To: users@deltaspike.apache.org
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.security@nissan-europe.com 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.security@nissan-europe.com 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.
***********************************************************************************************************


Re: Extending EntityRepository interface and EntityRepositoryHandler class

Posted by "John D. Ament" <jo...@apache.org>.
Or even leverage the EntityManagerAware interface.

On Thu, Nov 26, 2015 at 9:50 AM Thomas Hug <th...@gmail.com> wrote:

> 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 <Ro...@ntc-europe.co.uk>
> 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:Robin.Roos@ntc-europe.co.uk]
> > Sent: 26 November 2015 12:21
> > To: users@deltaspike.apache.org
> > 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.security@nissan-europe.com 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.security@nissan-europe.com 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.
> >
> >
> ***********************************************************************************************************
> >
> >
>

RE: Extending EntityRepository interface and EntityRepositoryHandler class

Posted by "Roos, Robin" <Ro...@ntc-europe.co.uk>.
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:



[cid:image001.png@01D1285E.5D3A6540]



So, given that I am unable actually to test, does this look feasible?



Thanks again, Robin.





-----Original Message-----
From: Thomas Hug [mailto:thomas.hug@gmail.com]
Sent: 26 November 2015 14:50
To: users@deltaspike.apache.org
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 <Ro...@ntc-europe.co.uk>>

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:Robin.Roos@ntc-europe.co.uk]

> Sent: 26 November 2015 12:21

> To: users@deltaspike.apache.org<ma...@deltaspike.apache.org>

> 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.security@nissan-europe.com<ma...@nissan-europe.com> 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.security@nissan-europe.com<ma...@nissan-europe.com> 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.security@nissan-europe.com 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.
***********************************************************************************************************

RE: Extending EntityRepository interface and EntityRepositoryHandler class

Posted by "Roos, Robin" <Ro...@ntc-europe.co.uk>.
Gentlemen,

The offshore team has tested this and reports success.  We can now use add() instead of save() to make transient instances persistent.

This is beneficial in an application which keeps Domain instances entirely within the transactional context and does not exploit detach/merge, and also where there are no stored-procs updating data (i.e. everything happens through the domain tier).

I would like to see 
    void add(E entity) 
put into EntityRepository.  Perhaps that would be possible in a future release?

In the meantime the solution is working for us.

Many thanks for your assistance.

Kind regards, Robin.

-----Original Message-----
From: Thomas Andraschko [mailto:andraschko.thomas@gmail.com] 
Sent: 26 November 2015 16:45
To: users@deltaspike.apache.org
Subject: Re: Extending EntityRepository interface and EntityRepositoryHandler class

Interceptors (@Transactional) on partial beans should work fine since 1.4.0.

2015-11-26 17:18 GMT+01:00 Thomas Hug <th...@gmail.com>:

> 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 
> <Ro...@ntc-europe.co.uk>
> 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:thomas.hug@gmail.com]
> > Sent: 26 November 2015 14:50
> > To: users@deltaspike.apache.org
> > 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 <
> Robin.Roos@ntc-europe.co.uk>
> >
> > 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:Robin.Roos@ntc-europe.co.uk
> > <Ro...@ntc-europe.co.uk>]
> >
> > > Sent: 26 November 2015 12:21
> >
> > > To: users@deltaspike.apache.org
> >
> > > 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.security@nissan-europe.com 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.security@nissan-europe.com 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.security@nissan-europe.com 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.security@nissan-europe.com 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.
***********************************************************************************************************

Re: Extending EntityRepository interface and EntityRepositoryHandler class

Posted by Thomas Andraschko <an...@gmail.com>.
Interceptors (@Transactional) on partial beans should work fine since 1.4.0.

2015-11-26 17:18 GMT+01:00 Thomas Hug <th...@gmail.com>:

> 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 <Ro...@ntc-europe.co.uk>
> 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:thomas.hug@gmail.com]
> > Sent: 26 November 2015 14:50
> > To: users@deltaspike.apache.org
> > 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 <
> Robin.Roos@ntc-europe.co.uk>
> >
> > 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:Robin.Roos@ntc-europe.co.uk
> > <Ro...@ntc-europe.co.uk>]
> >
> > > Sent: 26 November 2015 12:21
> >
> > > To: users@deltaspike.apache.org
> >
> > > 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.security@nissan-europe.com 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.security@nissan-europe.com 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.security@nissan-europe.com 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.
> >
> >
> ***********************************************************************************************************
> >
>

Re: Extending EntityRepository interface and EntityRepositoryHandler class

Posted by Thomas Hug <th...@gmail.com>.
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 <Ro...@ntc-europe.co.uk>
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:thomas.hug@gmail.com]
> Sent: 26 November 2015 14:50
> To: users@deltaspike.apache.org
> 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 <Ro...@ntc-europe.co.uk>
>
> 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:Robin.Roos@ntc-europe.co.uk
> <Ro...@ntc-europe.co.uk>]
>
> > Sent: 26 November 2015 12:21
>
> > To: users@deltaspike.apache.org
>
> > 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.security@nissan-europe.com 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.security@nissan-europe.com 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.security@nissan-europe.com 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.
>
> ***********************************************************************************************************
>

Re: Extending EntityRepository interface and EntityRepositoryHandler class

Posted by Thomas Hug <th...@gmail.com>.
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 <Ro...@ntc-europe.co.uk>
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:Robin.Roos@ntc-europe.co.uk]
> Sent: 26 November 2015 12:21
> To: users@deltaspike.apache.org
> 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.security@nissan-europe.com 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.security@nissan-europe.com 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.
>
> ***********************************************************************************************************
>
>