Skip to content

Commit

Permalink
add versioned DialectOverrides
Browse files Browse the repository at this point in the history
  • Loading branch information
gavinking committed Jan 18, 2022
1 parent 5b4657f commit 543e3f1
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/
package org.hibernate.annotations;

import org.hibernate.Incubating;
import org.hibernate.dialect.Dialect;

import java.lang.annotation.Annotation;
Expand All @@ -20,8 +21,24 @@
*
* @author Gavin King
*/
@Incubating
public interface DialectOverride {

/**
* Identifies a database version.
*
* @see org.hibernate.dialect.DatabaseVersion
*/
@Retention(RUNTIME)
@interface Version {
int major();
int minor() default 0;
}

/**
* Specializes a {@link org.hibernate.annotations.Check}
* in a certain dialect.
*/
@Target({METHOD, FIELD, TYPE})
@Retention(RUNTIME)
@OverridesAnnotation(org.hibernate.annotations.Check.class)
Expand All @@ -30,10 +47,16 @@ public interface DialectOverride {
* The {@link Dialect} in which this override applies.
*/
Class<? extends Dialect> dialect();
Version before() default @Version(major=Integer.MAX_VALUE);
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);

org.hibernate.annotations.Check override();
}

/**
* Specializes an {@link org.hibernate.annotations.OrderBy}
* in a certain dialect.
*/
@Target({METHOD, FIELD})
@Retention(RUNTIME)
@OverridesAnnotation(org.hibernate.annotations.OrderBy.class)
Expand All @@ -42,10 +65,16 @@ public interface DialectOverride {
* The {@link Dialect} in which this override applies.
*/
Class<? extends Dialect> dialect();
Version before() default @Version(major=Integer.MAX_VALUE);
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);

org.hibernate.annotations.OrderBy override();
}

/**
* Specializes a {@link org.hibernate.annotations.ColumnDefault}
* in a certain dialect.
*/
@Target({METHOD, FIELD})
@Retention(RUNTIME)
@OverridesAnnotation(org.hibernate.annotations.ColumnDefault.class)
Expand All @@ -54,10 +83,16 @@ public interface DialectOverride {
* The {@link Dialect} in which this override applies.
*/
Class<? extends Dialect> dialect();
Version before() default @Version(major=Integer.MAX_VALUE);
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);

org.hibernate.annotations.ColumnDefault override();
}

/**
* Specializes a {@link org.hibernate.annotations.GeneratedColumn}
* in a certain dialect.
*/
@Target({METHOD, FIELD})
@Retention(RUNTIME)
@OverridesAnnotation(org.hibernate.annotations.GeneratedColumn.class)
Expand All @@ -66,10 +101,16 @@ public interface DialectOverride {
* The {@link Dialect} in which this override applies.
*/
Class<? extends Dialect> dialect();
Version before() default @Version(major=Integer.MAX_VALUE);
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);

org.hibernate.annotations.GeneratedColumn override();
}

/**
* Specializes a {@link jakarta.persistence.DiscriminatorColumn}
* in a certain dialect.
*/
@Target(TYPE)
@Retention(RUNTIME)
@OverridesAnnotation(jakarta.persistence.DiscriminatorColumn.class)
Expand All @@ -78,10 +119,16 @@ public interface DialectOverride {
* The {@link Dialect} in which this override applies.
*/
Class<? extends Dialect> dialect();
Version before() default @Version(major=Integer.MAX_VALUE);
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);

jakarta.persistence.DiscriminatorColumn override();
}

/**
* Specializes a {@link org.hibernate.annotations.Formula}
* in a certain dialect.
*/
@Target({METHOD, FIELD})
@Retention(RUNTIME)
@OverridesAnnotation(org.hibernate.annotations.Formula.class)
Expand All @@ -90,10 +137,16 @@ public interface DialectOverride {
* The {@link Dialect} in which this override applies.
*/
Class<? extends Dialect> dialect();
Version before() default @Version(major=Integer.MAX_VALUE);
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);

org.hibernate.annotations.Formula override();
}

/**
* Specializes a {@link org.hibernate.annotations.JoinFormula}
* in a certain dialect.
*/
@Target({METHOD, FIELD})
@Retention(RUNTIME)
@OverridesAnnotation(org.hibernate.annotations.JoinFormula.class)
Expand All @@ -102,10 +155,16 @@ public interface DialectOverride {
* The {@link Dialect} in which this override applies.
*/
Class<? extends Dialect> dialect();
Version before() default @Version(major=Integer.MAX_VALUE);
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);

org.hibernate.annotations.JoinFormula override();
}

/**
* Specializes a {@link org.hibernate.annotations.Where}
* in a certain dialect.
*/
@Target({METHOD, FIELD, TYPE})
@Retention(RUNTIME)
@OverridesAnnotation(org.hibernate.annotations.Where.class)
Expand All @@ -114,10 +173,16 @@ public interface DialectOverride {
* The {@link Dialect} in which this override applies.
*/
Class<? extends Dialect> dialect();
Version before() default @Version(major=Integer.MAX_VALUE);
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);

org.hibernate.annotations.Where override();
}

/**
* Specializes {@link org.hibernate.annotations.Filters}
* in a certain dialect.
*/
@Target({METHOD, FIELD, TYPE})
@Retention(RUNTIME)
@OverridesAnnotation(org.hibernate.annotations.Filters.class)
Expand All @@ -126,10 +191,16 @@ public interface DialectOverride {
* The {@link Dialect} in which this override applies.
*/
Class<? extends Dialect> dialect();
Version before() default @Version(major=Integer.MAX_VALUE);
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);

org.hibernate.annotations.Filters override();
}

/**
* Specializes {@link org.hibernate.annotations.FilterDefs}
* in a certain dialect.
*/
@Target({PACKAGE, TYPE})
@Retention(RUNTIME)
@OverridesAnnotation(org.hibernate.annotations.FilterDefs.class)
Expand All @@ -138,13 +209,31 @@ public interface DialectOverride {
* The {@link Dialect} in which this override applies.
*/
Class<? extends Dialect> dialect();
Version before() default @Version(major=Integer.MAX_VALUE);
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);

org.hibernate.annotations.FilterDefs override();
}

/**
* Marks an annotation type as a dialect-specific override for
* some other annotation type.
* <p>
* The marked annotation must have the following members:
* <ul>
* <li>{@code Class<? extends Dialect> dialect()},
* <li>{@code Version before()},
* <li>{@code Version sameOrAfter()}, and
* <li>{@code A override()}, where {@code A} is the type
* of annotation which the marked annotation overrides.
* </ul>
*/
@Target({ANNOTATION_TYPE})
@Retention(RUNTIME)
@interface OverridesAnnotation {
/**
* The class of the annotation that is overridden.
*/
Class<? extends Annotation> value();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -859,7 +859,14 @@ public static <T extends Annotation> T getOverridableAnnotation(
Class<? extends Dialect> overrideDialect = (Class<? extends Dialect>)
type.getDeclaredMethod("dialect").invoke(annotation);
if ( overrideDialect.isAssignableFrom( dialect.getClass() ) ) {
return (T) type.getDeclaredMethod("override").invoke(annotation);
DialectOverride.Version before = (DialectOverride.Version)
type.getDeclaredMethod("before").invoke(annotation);
DialectOverride.Version sameOrAfter = (DialectOverride.Version)
type.getDeclaredMethod("sameOrAfter").invoke(annotation);
if ( dialect.getVersion().isBefore( before.major(), before.minor() )
&& dialect.getVersion().isSameOrAfter( sameOrAfter.major(), sameOrAfter.minor() ) ) {
return (T) type.getDeclaredMethod("override").invoke(annotation);
}
}
}
catch (Exception e) {
Expand Down

0 comments on commit 543e3f1

Please sign in to comment.