), but am sending it here as well as not everyone monitors StackOverflow.
have the need to log any changes to fields in an entity - whether it is a String change, or addition/deletion to a collection/map.
Given a JPA entity with a bunch of primitive fields, it is fairly trivial to write an pointcut that will intercept any set(..) methods on the fields.
However, where I am stuck is how to write the pointcut to handle Collections/Sets/Embedded/etc.
Given the following entity:
@Entity
public class Provider implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
private String name;
@Column(name="type", nullable=false)
@Enumerated(EnumType.STRING)
private ProviderType providerType;
@ManyToMany
private List<Contact> contacts;
@Embedded
private Validity validity;
// setters and getters omitted for brevity
}
where Contact is a simple entity with a bunch of primitive fields and Validity is a non-entity object with some primitive fields.
The following pointcut will intercept all set() methods in the class:
pointcut fieldSetter() : set(!static !final !transient * *.Provider) && args(val) && target(o);
to which I can write a before/after/around advice.
before( Object val, Object o) : fieldSetter{
String fieldName = thisJoinPointStaticPart.getSignature().getName();
System.out.println( "Object being changed: " + o.toString() );
System.out.println( "New Value for: " + fieldname + " is: " + v.toString() );
}
But how do I handle that case for an Embedded object or a Collection? For an Embedded object, if I just put my advice around the setter method in the object, how do I know which is the parent object that is actually being modified/persisted?
And in the case of collections/sets/maps/etc, how do I advise against the add/remove methods? What I need to end up doing is advising the getCollection().add() methods as well as the getCollection.remove() methods. But I can't seem to figure out a good way.
Thanks,
Eric