Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,10 @@
import jakarta.persistence.Id;

import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.DialectOverride;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.dialect.H2Dialect;
import org.hibernate.dialect.HSQLDialect;
import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase;

import org.junit.Test;
Expand Down Expand Up @@ -57,7 +60,12 @@ public static class Person {
@ColumnDefault("'N/A'")
private String name;

@ColumnDefault("-1")
@ColumnDefault(value = "-1",
overrides = {
@DialectOverride(dialect = HSQLDialect.class, value = "-1"),
@DialectOverride(dialect = H2Dialect.class, value = "-1*1")
}
)
private Long clientId;

//Getter and setters omitted for brevity
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,10 @@
* The check constraints string.
*/
String constraints();
/**
* A list of SQL constraints that should be used in the specified dialects.
*
* Overrides the default {@link #constraints()}.
*/
DialectOverride[] overrides() default {};
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,10 @@
* @return a SQL expression that evaluates to the default column value
*/
String value();
/**
* A list of SQL expressions that should be used in the specified dialects.
*
* Overrides the default {@link #value()}.
*/
DialectOverride[] overrides() default {};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.annotations;

import org.hibernate.dialect.Dialect;

import java.lang.annotation.Retention;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
* Defines a SQL expression or fragment of SQL that should be used in a given dialect.
* Allows a portable program to embed unportable native SQL in annotations.
*
* @see Formula#overrides()
* @see JoinFormula#overrides()
* @see DiscriminatorFormula#overrides()
* @see Check#overrides()
* @see ColumnDefault#overrides()
* @see Filter#overrides()
* @see FilterDef#overrides()
* @see Where#overrides()
* @see OrderBy#overrides()
*
* @author Gavin King
*/
@Retention(RUNTIME)
public @interface DialectOverride {
/**
* The {@link Dialect} to which this override applies.
*
* @return the concrete Java class of the {@code Dialect}
*/
Class<? extends Dialect> dialect();

/**
* The SQL expression or SQL fragment that should be used in the specified dialect.
*/
String value();
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,10 @@
* The formula string.
*/
String value();
/**
* A list of SQL formulas that should be used in the specified dialects.
*
* Overrides the default {@link #value()}.
*/
DialectOverride[] overrides() default {};
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,11 @@
* The alias descriptors for injection.
*/
SqlFragmentAlias[] aliases() default {};

/**
* A list of SQL conditions that should be used in the specified dialects.
*
* Overrides the default {@link #condition()}.
*/
DialectOverride[] overrides() default {};
}
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,11 @@
* The filter parameter definitions.
*/
ParamDef[] parameters() default {};

/**
* A list of SQL conditions that should be used in the specified dialects.
*
* Overrides the default {@link #defaultCondition()}.
*/
DialectOverride[] overrides() default {};
}
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,10 @@
* The formula string.
*/
String value();
/**
* A list of SQL formulas that should be used in the specified dialects.
*
* Overrides the default {@link #value()}.
*/
DialectOverride[] overrides() default {};
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,10 @@
* @return the SQL expression that is evaluated to generate the column value.
*/
String value();
/**
* A list of SQL expressions that should be used in the specified dialects.
*
* Overrides the default {@link #value()}.
*/
DialectOverride[] overrides() default {};
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,11 @@
* The column this formula references.
*/
String referencedColumnName() default "";

/**
* A list of SQL formulas that should be used in the specified dialects.
*
* Overrides the default {@link #value()}.
*/
DialectOverride[] overrides() default {};
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,10 @@
* The native SQL expression used to sort the collection elements.
*/
String clause();
/**
* A list of SQL ordering expressions that should be used in the specified dialects.
*
* Overrides the default {@link #clause()}.
*/
DialectOverride[] overrides() default {};
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,10 @@
* The where-clause predicate.
*/
String clause();
/**
* A list of SQL predicates that should be used in the specified dialects.
*
* Overrides the default {@link #clause()}.
*/
DialectOverride[] overrides() default {};
}
33 changes: 19 additions & 14 deletions hibernate-core/src/main/java/org/hibernate/cfg/AnnotatedColumn.java
Original file line number Diff line number Diff line change
Expand Up @@ -536,7 +536,7 @@ public static AnnotatedColumn[] buildColumnFromAnnotation(
AnnotatedColumn[] columns;
if ( formulaAnn != null ) {
AnnotatedColumn formulaColumn = new AnnotatedColumn();
formulaColumn.setFormula( formulaAnn.value() );
formulaColumn.setFormula( getFormulaValue(formulaAnn, context) );
formulaColumn.setImplicit( false );
formulaColumn.setBuildingContext( context );
formulaColumn.setPropertyHolder( propertyHolder );
Expand Down Expand Up @@ -614,7 +614,6 @@ public static AnnotatedColumn[] buildColumnFromAnnotation(
}

AnnotatedColumn column = new AnnotatedColumn();

column.setImplicit( false );
column.setSqlType( sqlType );
column.setLength( (long) col.length() );
Expand Down Expand Up @@ -654,6 +653,18 @@ public static AnnotatedColumn[] buildColumnFromAnnotation(
return columns;
}

private static String getFormulaValue(org.hibernate.annotations.Formula annotation, MetadataBuildingContext context) {
return annotation == null ? null : AnnotationBinder.dialectValue( annotation.value(), annotation.overrides(), context );
}

private static String getColumnDefaultValue(ColumnDefault annotation, MetadataBuildingContext context) {
return annotation == null ? null : AnnotationBinder.dialectValue( annotation.value(), annotation.overrides(), context );
}

private static String getGeneratedAsValue(GeneratedColumn annotation, MetadataBuildingContext context) {
return annotation == null ? null : AnnotationBinder.dialectValue( annotation.value(), annotation.overrides(), context );
}

private void applyColumnDefault(PropertyData inferredData, int length) {
final XProperty xProperty = inferredData.getProperty();
if ( xProperty != null ) {
Expand All @@ -662,14 +673,9 @@ private void applyColumnDefault(PropertyData inferredData, int length) {
if (length!=1) {
throw new MappingException("@ColumnDefault may only be applied to single-column mappings");
}
setDefaultValue( columnDefaultAnn.value() );
setDefaultValue( getColumnDefaultValue( columnDefaultAnn, context ) );
}
}
else {
LOG.trace(
"Could not perform @ColumnDefault lookup as 'PropertyData' did not give access to XProperty"
);
}
}

private void applyGeneratedAs(PropertyData inferredData, int length) {
Expand All @@ -680,7 +686,7 @@ private void applyGeneratedAs(PropertyData inferredData, int length) {
if (length!=1) {
throw new MappingException("@GeneratedColumn may only be applied to single-column mappings");
}
setGeneratedAs( generatedAnn.value() );
setGeneratedAs( getGeneratedAsValue( generatedAnn, context ) );
}
}
else {
Expand Down Expand Up @@ -830,10 +836,9 @@ void addUniqueKey(String uniqueKeyName, boolean inSecondPass) {

@Override
public String toString() {
return "Ejb3Column" + "{table=" + getTable()
+ ", mappingColumn=" + mappingColumn.getName()
+ ", insertable=" + insertable
+ ", updatable=" + updatable
+ ", unique=" + unique + '}';
return String.format(
"Ejb3Column{table=%s, mappingColumn=%s, insertable=%s, updatable=%s, unique=%s}",
getTable(), mappingColumn.getName(), insertable, updatable, unique
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ public void setDiscriminatorTypeName(String discriminatorTypeName) {
this.discriminatorTypeName = discriminatorTypeName;
}

private static String getFormulaValue(DiscriminatorFormula annotation, MetadataBuildingContext context) {
return annotation == null ? null : AnnotationBinder.dialectValue( annotation.value(), annotation.overrides(), context );
}

public static AnnotatedDiscriminatorColumn buildDiscriminatorColumn(
DiscriminatorType type, DiscriminatorColumn discAnn,
DiscriminatorFormula discFormulaAnn,
Expand All @@ -50,7 +54,7 @@ public static AnnotatedDiscriminatorColumn buildDiscriminatorColumn(
discriminatorColumn.setImplicit( true );
if ( discFormulaAnn != null ) {
discriminatorColumn.setImplicit( false );
discriminatorColumn.setFormula( discFormulaAnn.value() );
discriminatorColumn.setFormula( getFormulaValue( discFormulaAnn, context ) );
}
else if ( discAnn != null ) {
discriminatorColumn.setImplicit( false );
Expand Down Expand Up @@ -85,11 +89,8 @@ else if ( DiscriminatorType.STRING.equals( type ) || type == null ) {

@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append( "Ejb3DiscriminatorColumn" );
sb.append( "{logicalColumnName'" ).append( getLogicalColumnName() ).append( '\'' );
sb.append( ", discriminatorTypeName='" ).append( discriminatorTypeName ).append( '\'' );
sb.append( '}' );
return sb.toString();
return String.format("Ejb3DiscriminatorColumn{logicalColumnName'%s', discriminatorTypeName='%s'}",
getLogicalColumnName(), discriminatorTypeName
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -171,8 +171,8 @@ public static AnnotatedJoinColumn buildJoinFormula(
String propertyName,
MetadataBuildingContext buildingContext) {
AnnotatedJoinColumn formulaColumn = new AnnotatedJoinColumn();
formulaColumn.setFormula( ann.value() );
formulaColumn.setReferencedColumn(ann.referencedColumnName());
formulaColumn.setFormula( getJoinFormulaValue( ann, buildingContext ) );
formulaColumn.setReferencedColumn( ann.referencedColumnName() );
formulaColumn.setBuildingContext( buildingContext );
formulaColumn.setPropertyHolder( propertyHolder );
formulaColumn.setJoins( joins );
Expand All @@ -181,6 +181,10 @@ public static AnnotatedJoinColumn buildJoinFormula(
return formulaColumn;
}

private static String getJoinFormulaValue(JoinFormula annotation, MetadataBuildingContext context) {
return annotation == null ? null : AnnotationBinder.dialectValue( annotation.value(), annotation.overrides(), context );
}

public static AnnotatedJoinColumn[] buildJoinColumns(
JoinColumn[] anns,
Comment comment,
Expand Down Expand Up @@ -972,12 +976,9 @@ public void setMappedBy(String entityName, String jpaEntityName, String logicalT

@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append( "Ejb3JoinColumn" );
sb.append( "{logicalColumnName='" ).append( getLogicalColumnName() ).append( '\'' );
sb.append( ", referencedColumn='" ).append( referencedColumn ).append( '\'' );
sb.append( ", mappedBy='" ).append( mappedBy ).append( '\'' );
sb.append( '}' );
return sb.toString();
return String.format(
"Ejb3JoinColumn{logicalColumnName='%s', referencedColumn='%s', mappedBy='%s'}",
getLogicalColumnName(), referencedColumn, mappedBy
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
import org.hibernate.annotations.CollectionTypeRegistrations;
import org.hibernate.annotations.Columns;
import org.hibernate.annotations.Comment;
import org.hibernate.annotations.DialectOverride;
import org.hibernate.annotations.DiscriminatorFormula;
import org.hibernate.annotations.DiscriminatorOptions;
import org.hibernate.annotations.EmbeddableInstantiatorRegistration;
Expand Down Expand Up @@ -104,6 +105,7 @@
import org.hibernate.cfg.annotations.QueryBinder;
import org.hibernate.cfg.annotations.TableBinder;
import org.hibernate.cfg.internal.NullableDiscriminatorColumnSecondPass;
import org.hibernate.dialect.Dialect;
import org.hibernate.engine.OptimisticLockStyle;
import org.hibernate.engine.spi.FilterDefinition;
import org.hibernate.id.IdentifierGenerator;
Expand Down Expand Up @@ -641,9 +643,7 @@ else if ( InheritanceType.JOINED.equals( inheritanceState.getType() ) ) {

if ( inheritanceState.hasTable() ) {
Check checkAnn = clazzToProcess.getAnnotation( Check.class );
String constraints = checkAnn == null
? null
: checkAnn.constraints();
String constraints = getCheckConstraints( checkAnn, context );

EntityTableXref denormalizedTableXref = inheritanceState.hasDenormalizedTable()
? context.getMetadataCollector().getEntityTableXref( superEntity.getEntityName() )
Expand Down Expand Up @@ -1463,11 +1463,29 @@ private static void bindFilterDef(FilterDef defAnn, MetadataBuildingContext cont
);
}

final FilterDefinition def = new FilterDefinition( defAnn.name(), defAnn.defaultCondition(), params );
final FilterDefinition def = new FilterDefinition( defAnn.name(), getFilterCondition( defAnn, context ), params );
LOG.debugf( "Binding filter definition: %s", def.getFilterName() );
context.getMetadataCollector().addFilterDefinition( def );
}

static String getFilterCondition(FilterDef annotation, MetadataBuildingContext context) {
return annotation == null ? null : dialectValue( annotation.defaultCondition(), annotation.overrides(), context );
}

private static String getCheckConstraints(Check annotation, MetadataBuildingContext context) {
return annotation == null ? null : dialectValue( annotation.constraints(), annotation.overrides(), context );
}

public static String dialectValue(String defaultValue, DialectOverride[] dialectOverrides, MetadataBuildingContext context) {
Dialect dialect = context.getMetadataCollector().getDatabase().getDialect();
for ( DialectOverride df: dialectOverrides ) {
if ( df.dialect().isInstance(dialect) ) {
return df.value();
}
}
return defaultValue;
}

private static void bindCallbacks(XClass entityClass, PersistentClass persistentClass,
MetadataBuildingContext context) {
ReflectionManager reflectionManager = context.getBootstrapContext().getReflectionManager();
Expand Down
Loading