Skip to content

Commit f052b8c

Browse files
committed
add versioned DialectOverrides
1 parent 5b4657f commit f052b8c

File tree

2 files changed

+88
-1
lines changed

2 files changed

+88
-1
lines changed

hibernate-core/src/main/java/org/hibernate/annotations/DialectOverride.java

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
*/
77
package org.hibernate.annotations;
88

9+
import org.hibernate.Incubating;
910
import org.hibernate.dialect.Dialect;
1011

1112
import java.lang.annotation.Annotation;
@@ -20,8 +21,24 @@
2021
*
2122
* @author Gavin King
2223
*/
24+
@Incubating
2325
public interface DialectOverride {
2426

27+
/**
28+
* Identifies a database version.
29+
*
30+
* @see org.hibernate.dialect.DatabaseVersion
31+
*/
32+
@Retention(RUNTIME)
33+
@interface Version {
34+
int major();
35+
int minor() default 0;
36+
}
37+
38+
/**
39+
* Specializes a {@link org.hibernate.annotations.Check}
40+
* in a certain dialect.
41+
*/
2542
@Target({METHOD, FIELD, TYPE})
2643
@Retention(RUNTIME)
2744
@OverridesAnnotation(org.hibernate.annotations.Check.class)
@@ -30,10 +47,16 @@ public interface DialectOverride {
3047
* The {@link Dialect} in which this override applies.
3148
*/
3249
Class<? extends Dialect> dialect();
50+
Version before() default @Version(major=Integer.MAX_VALUE);
51+
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);
3352

3453
org.hibernate.annotations.Check override();
3554
}
3655

56+
/**
57+
* Specializes an {@link org.hibernate.annotations.OrderBy}
58+
* in a certain dialect.
59+
*/
3760
@Target({METHOD, FIELD})
3861
@Retention(RUNTIME)
3962
@OverridesAnnotation(org.hibernate.annotations.OrderBy.class)
@@ -42,10 +65,16 @@ public interface DialectOverride {
4265
* The {@link Dialect} in which this override applies.
4366
*/
4467
Class<? extends Dialect> dialect();
68+
Version before() default @Version(major=Integer.MAX_VALUE);
69+
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);
4570

4671
org.hibernate.annotations.OrderBy override();
4772
}
4873

74+
/**
75+
* Specializes a {@link org.hibernate.annotations.ColumnDefault}
76+
* in a certain dialect.
77+
*/
4978
@Target({METHOD, FIELD})
5079
@Retention(RUNTIME)
5180
@OverridesAnnotation(org.hibernate.annotations.ColumnDefault.class)
@@ -54,10 +83,16 @@ public interface DialectOverride {
5483
* The {@link Dialect} in which this override applies.
5584
*/
5685
Class<? extends Dialect> dialect();
86+
Version before() default @Version(major=Integer.MAX_VALUE);
87+
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);
5788

5889
org.hibernate.annotations.ColumnDefault override();
5990
}
6091

92+
/**
93+
* Specializes a {@link org.hibernate.annotations.GeneratedColumn}
94+
* in a certain dialect.
95+
*/
6196
@Target({METHOD, FIELD})
6297
@Retention(RUNTIME)
6398
@OverridesAnnotation(org.hibernate.annotations.GeneratedColumn.class)
@@ -66,10 +101,16 @@ public interface DialectOverride {
66101
* The {@link Dialect} in which this override applies.
67102
*/
68103
Class<? extends Dialect> dialect();
104+
Version before() default @Version(major=Integer.MAX_VALUE);
105+
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);
69106

70107
org.hibernate.annotations.GeneratedColumn override();
71108
}
72109

110+
/**
111+
* Specializes a {@link jakarta.persistence.DiscriminatorColumn}
112+
* in a certain dialect.
113+
*/
73114
@Target(TYPE)
74115
@Retention(RUNTIME)
75116
@OverridesAnnotation(jakarta.persistence.DiscriminatorColumn.class)
@@ -78,10 +119,16 @@ public interface DialectOverride {
78119
* The {@link Dialect} in which this override applies.
79120
*/
80121
Class<? extends Dialect> dialect();
122+
Version before() default @Version(major=Integer.MAX_VALUE);
123+
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);
81124

82125
jakarta.persistence.DiscriminatorColumn override();
83126
}
84127

128+
/**
129+
* Specializes a {@link org.hibernate.annotations.Formula}
130+
* in a certain dialect.
131+
*/
85132
@Target({METHOD, FIELD})
86133
@Retention(RUNTIME)
87134
@OverridesAnnotation(org.hibernate.annotations.Formula.class)
@@ -90,10 +137,16 @@ public interface DialectOverride {
90137
* The {@link Dialect} in which this override applies.
91138
*/
92139
Class<? extends Dialect> dialect();
140+
Version before() default @Version(major=Integer.MAX_VALUE);
141+
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);
93142

94143
org.hibernate.annotations.Formula override();
95144
}
96145

146+
/**
147+
* Specializes a {@link org.hibernate.annotations.JoinFormula}
148+
* in a certain dialect.
149+
*/
97150
@Target({METHOD, FIELD})
98151
@Retention(RUNTIME)
99152
@OverridesAnnotation(org.hibernate.annotations.JoinFormula.class)
@@ -102,10 +155,16 @@ public interface DialectOverride {
102155
* The {@link Dialect} in which this override applies.
103156
*/
104157
Class<? extends Dialect> dialect();
158+
Version before() default @Version(major=Integer.MAX_VALUE);
159+
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);
105160

106161
org.hibernate.annotations.JoinFormula override();
107162
}
108163

164+
/**
165+
* Specializes a {@link org.hibernate.annotations.Where}
166+
* in a certain dialect.
167+
*/
109168
@Target({METHOD, FIELD, TYPE})
110169
@Retention(RUNTIME)
111170
@OverridesAnnotation(org.hibernate.annotations.Where.class)
@@ -114,10 +173,16 @@ public interface DialectOverride {
114173
* The {@link Dialect} in which this override applies.
115174
*/
116175
Class<? extends Dialect> dialect();
176+
Version before() default @Version(major=Integer.MAX_VALUE);
177+
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);
117178

118179
org.hibernate.annotations.Where override();
119180
}
120181

182+
/**
183+
* Specializes {@link org.hibernate.annotations.Filters}
184+
* in a certain dialect.
185+
*/
121186
@Target({METHOD, FIELD, TYPE})
122187
@Retention(RUNTIME)
123188
@OverridesAnnotation(org.hibernate.annotations.Filters.class)
@@ -126,10 +191,16 @@ public interface DialectOverride {
126191
* The {@link Dialect} in which this override applies.
127192
*/
128193
Class<? extends Dialect> dialect();
194+
Version before() default @Version(major=Integer.MAX_VALUE);
195+
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);
129196

130197
org.hibernate.annotations.Filters override();
131198
}
132199

200+
/**
201+
* Specializes {@link org.hibernate.annotations.FilterDefs}
202+
* in a certain dialect.
203+
*/
133204
@Target({PACKAGE, TYPE})
134205
@Retention(RUNTIME)
135206
@OverridesAnnotation(org.hibernate.annotations.FilterDefs.class)
@@ -138,13 +209,22 @@ public interface DialectOverride {
138209
* The {@link Dialect} in which this override applies.
139210
*/
140211
Class<? extends Dialect> dialect();
212+
Version before() default @Version(major=Integer.MAX_VALUE);
213+
Version sameOrAfter() default @Version(major=Integer.MIN_VALUE);
141214

142215
org.hibernate.annotations.FilterDefs override();
143216
}
144217

218+
/**
219+
* Marks an annotation is a dialect-specific override for
220+
* another annotation.
221+
*/
145222
@Target({ANNOTATION_TYPE})
146223
@Retention(RUNTIME)
147224
@interface OverridesAnnotation {
225+
/**
226+
* The class of the annotation that is overridden.
227+
*/
148228
Class<? extends Annotation> value();
149229
}
150230
}

hibernate-core/src/main/java/org/hibernate/cfg/AnnotationBinder.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,14 @@ public static <T extends Annotation> T getOverridableAnnotation(
859859
Class<? extends Dialect> overrideDialect = (Class<? extends Dialect>)
860860
type.getDeclaredMethod("dialect").invoke(annotation);
861861
if ( overrideDialect.isAssignableFrom( dialect.getClass() ) ) {
862-
return (T) type.getDeclaredMethod("override").invoke(annotation);
862+
DialectOverride.Version before = (DialectOverride.Version)
863+
type.getDeclaredMethod("before").invoke(annotation);
864+
DialectOverride.Version sameOrAfter = (DialectOverride.Version)
865+
type.getDeclaredMethod("sameOrAfter").invoke(annotation);
866+
if ( dialect.getVersion().isBefore( before.major(), before.minor() )
867+
&& dialect.getVersion().isSameOrAfter( sameOrAfter.major(), sameOrAfter.minor() ) ) {
868+
return (T) type.getDeclaredMethod("override").invoke(annotation);
869+
}
863870
}
864871
}
865872
catch (Exception e) {

0 commit comments

Comments
 (0)