[ 
https://issues.apache.org/jira/browse/JDO-764?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16108151#comment-16108151
 ] 

Craig L Russell commented on JDO-764:
-------------------------------------

I think there is a problem if you do not support merging annotations, in all 
the annotations that take names of things and not defaults or behaviors.

In your example, @PersistenceCapable could not be used in a meta-annotation 
because the table= value could not be set elsewhere. 

My rationale for allowing multiple annotations is to support the test case 
usage, which is based on your example, @DatastorePersistable, which could only 
use the default table name strategy if @PersistenceCapable cannot be used twice.

On the implementation side, the DataNucleus code now catches multiple 
annotations and issues an error message. But it seems like it is just as easy 
to collect annotations and apply them to the DataNucleus metamodel. What is the 
harm in processing all such annotations that are applied to an element? The 
first time the DataNucleus metamodel encounters @PersistenceCapable it fills 
the metamodel with the values it finds. The next time it encounters 
@PersistenceCapable it fills the metamodel with additional values. The way the 
specification draft is written, it is undefined what happens if multiple 
annotations with conflicting values are processed, so there is no need to find 
out if this is the first or nth identical annotation. If the user has a 
conflict, results are unpredictable, as expected.




> Allow JDO annotations to be used in meta-annotations
> ----------------------------------------------------
>
>                 Key: JDO-764
>                 URL: https://issues.apache.org/jira/browse/JDO-764
>             Project: JDO
>          Issue Type: Improvement
>          Components: api, specification
>    Affects Versions: JDO 3.1
>            Reporter: Andy Jefferson
>             Fix For: JDO 3.2
>
>         Attachments: jdo-764.patch
>
>
> By default annotations are used directly in a persistable class. Java 
> additionally allows annotations to be formed of other annotations. This is 
> particularly useful where a user has a particular combination of annotations 
> to set on a class/field/method and wants to simply annotate with an 
> abbreviated form. For example, specifying attributes of an annotation
> @PersistenceCapable(detachable="true", identityType="datastore", 
> embeddedOnly="true")
> or formed of multiple annotations
> @PersistenceCapable(detachable="true")
> @Extension(vendorName="datanucleus", key="multitenancy-column-name", 
> value="TENANT")
> These can be represented as meta-annotations like this
> @Target(TYPE)
> @Retention(RUNTIME)
> @PersistenceCapable(detachable="true", identityType="datastore", 
> embeddedOnly="true")
> public @interface DatastoreIdPersistable
> {
> }
> @Target(TYPE)
> @Retention(RUNTIME)
> @PersistenceCapable(detachable="true")
> @Extension(vendorName="datanucleus", key="multitenancy-column-name", 
> value="TENANT")
> public @interface MultitenantPersistable
> {
> }
> and the user can subsequently just annotate their persistable class as
> @DatastoreIdPersistable
> public class MyClass1 {...}
> @MultitenantPersistable
> public class MyClass2 {...}
> The work required to support this in the JDO spec is simply to update the 
> following annotations to add @Target({ElementType.ANNOTATION_TYPE})
> The annotations requiring this are
> @Element, @EmbeddedId, @Key, @NotPersistent, @Order, @Persistent, 
> @Serialized, @Transactional, and @Value  (all other annotations already have 
> @Target({ElementType.TYPE}) which already permits their usage in 
> meta-annotations.
> The same is proposed for JPA 2.2, see 
> https://github.com/javaee/jpa-spec/issues/43



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Reply via email to