Details
-
Improvement
-
Status: Closed
-
Major
-
Resolution: Fixed
-
JDO 3.1
-
None
Description
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(
) 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