Take a look at -Xhasmember option to ajc. You should be able to do something
along the following lines:
interface NeedsPrePersist {
}

declare parents: !hasfield(@PrePersist * *) && (@Entity *) extends
NeedPrePersist;

Then introduce fields and methods to only types that implement
NeedPrePersist.

-Ramnivas

On Tue, Aug 4, 2009 at 3:32 PM, Matthew Adams <[email protected]>wrote:

> Hi all,
>
> I was wondering how it might be possible to achieve what I'm calling a
> conditional inter-type declaration.
>
> Here's a simple auditing example.  For a JPA entity, I want to
> introduce a @PrePersist method if and only if the target class doesn't
> have one because it's an error to have multiple @PrePersist methods on
> an entity.  If it already has a @PrePersist method, I want to execute
> advice after the target instance's @PrePersist method is invoked by
> the JPA implementation.  Same for @PreUpdate.
>
> The example below will work for Person, but not for Document --
> Document will end up with two @PrePersist methods.  How can I refactor
> this to work for both?
>
> ========
> @Entity
> public class Document {
>  // ...
>  @PrePersist
>  private void prePersist() { /* ... */ }
> }
> ========
> @Entity
> public class Person {
>  // ...
> }
> ========
> // works only for an @Entity that DOES NOT define a @PrePersist or a
> @PreUpdate method
> public aspect AuditingItd {
>        private interface Auditable {
>        }
>
>        declare parents:  (@javax.persistence.Entity *) implements
> Auditable;
>
>        @Column(name = "updated")
>        private Date Auditable.updated;
>
>        @PrePersist
>        private void Auditable.auditablePrePersist() {
>                updated = new Date();
>        }
>
>        @PreUpdate
>        private void Auditable.auditablePreUpdate() {
>                updated = new Date();
>        }
> }
> =========
>
> -matthew
>
> --
> mailto:[email protected]
> skype:matthewadams12
> yahoo:matthewadams
> aol:matthewadams12
> google-talk:[email protected]<google-talk%[email protected]>
> msn:[email protected]
> http://matthewadams.me
> http://www.linkedin.com/in/matthewadams
> _______________________________________________
> aspectj-users mailing list
> [email protected]
> https://dev.eclipse.org/mailman/listinfo/aspectj-users
>
_______________________________________________
aspectj-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/aspectj-users

Reply via email to