Skip to content

Commit

Permalink
HHH-16535 introduce @array annotation
Browse files Browse the repository at this point in the history
  • Loading branch information
gavinking committed May 2, 2023
1 parent 57029dd commit a56942c
Show file tree
Hide file tree
Showing 17 changed files with 117 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -746,7 +746,7 @@ public boolean supportsBitType() {
}

@Override
public String getArrayTypeName(String javaElementTypeName, String elementTypeName) {
public String getArrayTypeName(String javaElementTypeName, String elementTypeName, Integer maxLength) {
return javaElementTypeName + "Array";
}

Expand Down
30 changes: 30 additions & 0 deletions hibernate-core/src/main/java/org/hibernate/annotations/Array.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
* 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.Incubating;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
* Specifies the maximum length of a SQL array type mapped by
* the annotated attribute. For example:
* <pre>
*
* </pre>
*/
@Incubating
@Target({FIELD, METHOD})
@Retention( RUNTIME )
public @interface Array {
int length();
}
32 changes: 15 additions & 17 deletions hibernate-core/src/main/java/org/hibernate/annotations/Struct.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,41 +7,39 @@
package org.hibernate.annotations;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.hibernate.Incubating;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
* Specifies the UDT (user defined type) name for the annotated embeddable or embedded.
*
* Specifies the UDT (user defined type) name for the annotated embeddable
* type or embedded attribute.
* <p>
* This annotation may be applied to an embeddable class:
* <pre>
* Example:
*
* {@code @Embeddable}
* {@code Struct(name = "CUST")}
* public class Customer { ... }
* {@code @Embeddable}
* {@code Struct(name = "CUST")}
* public class Customer { ... }
* </pre>
*
* Alternatively, it may be applied to an embedded attribute:
* <pre>
* Example:
*
* public class Order {
* {@code Embedded}
* {@code Struct(name = "CUST")}
* private Customer customer;
* }
* public class Order {
* {@code Embedded}
* {@code Struct(name = "CUST")}
* private Customer customer;
* }
* </pre>
*
* @since 6.2
*/
@Incubating
@Target({TYPE, FIELD, METHOD})
@Retention( RetentionPolicy.RUNTIME )
@Retention( RUNTIME )
public @interface Struct {
/**
* The name of the UDT (user defined type).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import java.util.Map;

import org.hibernate.AnnotationException;
import org.hibernate.annotations.Array;
import org.hibernate.annotations.Check;
import org.hibernate.annotations.Checks;
import org.hibernate.annotations.ColumnDefault;
Expand Down Expand Up @@ -75,6 +76,7 @@ public class AnnotatedColumn {
private Long length;
private Integer precision;
private Integer scale;
private Integer arrayLength;
private String logicalColumnName;
private boolean unique;
private boolean nullable = true;
Expand Down Expand Up @@ -120,6 +122,14 @@ public Integer getScale() {
return scale;
}

public Integer getArrayLength() {
return arrayLength;
}

public void setArrayLength(Integer arrayLength) {
this.arrayLength = arrayLength;
}

public boolean isUnique() {
return unique;
}
Expand Down Expand Up @@ -228,6 +238,7 @@ public void bind() {
length,
precision,
scale,
arrayLength,
nullable,
sqlType,
unique,
Expand Down Expand Up @@ -257,6 +268,7 @@ protected void initMappingColumn(
Long length,
Integer precision,
Integer scale,
Integer arrayLength,
boolean nullable,
String sqlType,
boolean unique,
Expand All @@ -273,6 +285,7 @@ protected void initMappingColumn(
mappingColumn.setPrecision( precision );
mappingColumn.setScale( scale );
}
mappingColumn.setArrayLength( arrayLength );
mappingColumn.setNullable( nullable );
mappingColumn.setSqlType( sqlType );
mappingColumn.setUnique( unique );
Expand Down Expand Up @@ -732,6 +745,9 @@ private static AnnotatedColumn buildColumn(
annotatedColumn.setLength( (long) column.length() );
annotatedColumn.setPrecision( column.precision() );
annotatedColumn.setScale( column.scale() );
if ( inferredData.getProperty().isAnnotationPresent(Array.class) ) {
annotatedColumn.setArrayLength( inferredData.getProperty().getAnnotation(Array.class).length() );
}
// annotatedColumn.setPropertyHolder( propertyHolder );
// annotatedColumn.setPropertyName( getRelativePath( propertyHolder, inferredData.getPropertyName() ) );
annotatedColumn.setNullable( column.nullable() ); //TODO force to not null if available? This is a (bad) user choice.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -311,9 +311,11 @@ public void linkValueUsingDefaultColumnNaming(
final Column mappingColumn = getMappingColumn();
initMappingColumn(
columnName,
null, referencedColumn.getLength(),
null,
referencedColumn.getLength(),
referencedColumn.getPrecision(),
referencedColumn.getScale(),
referencedColumn.getArrayLength(),
mappingColumn != null && mappingColumn.isNullable(),
referencedColumn.getSqlType(),
mappingColumn != null && mappingColumn.isUnique(),
Expand All @@ -339,6 +341,7 @@ public void linkValueUsingAColumnCopy(Column column, SimpleValue value) {
column.getLength(),
column.getPrecision(),
column.getScale(),
column.getArrayLength(),
getMappingColumn().isNullable(),
column.getSqlType(),
getMappingColumn().isUnique(),
Expand Down Expand Up @@ -390,6 +393,7 @@ public void overrideFromReferencedColumnIfNecessary(Column column) {
mappingColumn.setLength( column.getLength() );
mappingColumn.setPrecision( column.getPrecision() );
mappingColumn.setScale( column.getScale() );
mappingColumn.setArrayLength( column.getArrayLength() );
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -247,5 +247,6 @@ private void applyComponentColumnSizeValueToJoinColumn(Column column, AnnotatedJ
mappingColumn.setLength( column.getLength() );
mappingColumn.setPrecision( column.getPrecision() );
mappingColumn.setScale( column.getScale() );
mappingColumn.setArrayLength( column.getArrayLength() );
}
}
11 changes: 9 additions & 2 deletions hibernate-core/src/main/java/org/hibernate/dialect/Dialect.java
Original file line number Diff line number Diff line change
Expand Up @@ -4192,8 +4192,15 @@ public boolean supportsStandardArrays() {
*
* @since 6.1
*/
public String getArrayTypeName(String javaElementTypeName, String elementTypeName) {
return supportsStandardArrays() ? elementTypeName + " array" : null;
public String getArrayTypeName(String javaElementTypeName, String elementTypeName, Integer maxLength) {
if ( supportsStandardArrays() ) {
return maxLength == null
? elementTypeName + " array"
: elementTypeName + " array[" + maxLength + "]";
}
else {
return null;
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1295,8 +1295,8 @@ public boolean supportsStandardArrays() {
}

@Override
public String getArrayTypeName(String javaElementTypeName, String elementTypeName) {
return wrapped.getArrayTypeName( javaElementTypeName, elementTypeName );
public String getArrayTypeName(String javaElementTypeName, String elementTypeName, Integer maxLength) {
return wrapped.getArrayTypeName( javaElementTypeName, elementTypeName, maxLength );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,11 +66,8 @@ public <T> JavaType<T> getJdbcRecommendedJavaTypeMapping(
Integer precision,
Integer scale,
TypeConfiguration typeConfiguration) {
final JavaType<Object> elementJavaType = elementJdbcType.getJdbcRecommendedJavaTypeMapping(
precision,
scale,
typeConfiguration
);
final JavaType<Object> elementJavaType =
elementJdbcType.getJdbcRecommendedJavaTypeMapping( precision, scale, typeConfiguration );
return typeConfiguration.getJavaTypeRegistry().resolveDescriptor(
Array.newInstance( elementJavaType.getJavaTypeClass(), 0 ).getClass()
);
Expand Down Expand Up @@ -173,6 +170,7 @@ static String getTypeName(WrapperOptions options, BasicPluralJavaType<?> contain
static String getTypeName(JavaType<?> elementJavaType, Dialect dialect) {
return dialect.getArrayTypeName(
elementJavaType.getJavaTypeClass().getSimpleName(),
null, // not needed by OracleDialect.getArrayTypeName()
null // not needed by OracleDialect.getArrayTypeName()
);
}
Expand All @@ -199,22 +197,23 @@ public void addAuxiliaryDatabaseObjects(
),
new BasicTypeImpl<>( elementJavaType, getElementJdbcType() )
);
int arrayLength = columnSize.getArrayLength() == null ? 127 : columnSize.getArrayLength();
database.addAuxiliaryDatabaseObject(
new NamedAuxiliaryDatabaseObject(
elementTypeName,
database.getDefaultNamespace(),
getCreateArrayTypeCommand( elementTypeName, elementType ),
getCreateArrayTypeCommand( elementTypeName, arrayLength, elementType ),
getDropArrayTypeCommand( elementTypeName ),
emptySet(),
true
)
);
}

String[] getCreateArrayTypeCommand(String elementTypeName, String elementType) {
String[] getCreateArrayTypeCommand(String elementTypeName, int length, String elementType) {
return new String[]{
"create or replace type " + elementTypeName
+ " as varying array(255) of " + elementType
+ " as varying array(" + length + ") of " + elementType
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -785,7 +785,7 @@ public boolean supportsBitType() {
}

@Override
public String getArrayTypeName(String javaElementTypeName, String elementTypeName) {
public String getArrayTypeName(String javaElementTypeName, String elementTypeName, Integer maxLength) {
return javaElementTypeName + "Array";
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,7 @@ public boolean supportsStandardArrays() {
}

@Override
public String getArrayTypeName(String javaElementTypeName, String elementTypeName) {
public String getArrayTypeName(String javaElementTypeName, String elementTypeName, Integer maxLength) {
return "ARRAY<" + elementTypeName + ">";
}

Expand Down
10 changes: 10 additions & 0 deletions hibernate-core/src/main/java/org/hibernate/engine/jdbc/Size.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ public long getFactor() {
private Integer scale;

private Long length;
private Integer arrayLength;
private LobMultiplier lobMultiplier;

public Size() {
Expand Down Expand Up @@ -106,6 +107,10 @@ public Long getLength() {
return length;
}

public Integer getArrayLength() {
return arrayLength;
}

public LobMultiplier getLobMultiplier() {
return lobMultiplier;
}
Expand All @@ -131,6 +136,11 @@ public Size setLength(Long length) {
return this;
}

public Size setArrayLength(Integer arrayLength) {
this.arrayLength = arrayLength;
return this;
}

public Size setLobMultiplier(LobMultiplier lobMultiplier) {
this.lobMultiplier = lobMultiplier;
return this;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ public AggregateColumn(Column column, Component component) {
setLength( column.getLength() );
setPrecision( column.getPrecision() );
setScale( column.getScale() );
setArrayLength( column.getArrayLength() );
setValue( column.getValue() );
setTypeIndex( column.getTypeIndex() );
setName( column.getQuotedName() );
Expand Down
14 changes: 13 additions & 1 deletion hibernate-core/src/main/java/org/hibernate/mapping/Column.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ public class Column implements Selectable, Serializable, Cloneable, ColumnTypeIn
private Long length;
private Integer precision;
private Integer scale;
private Integer arrayLength;
private Value value;
private int typeIndex;
private String name;
Expand Down Expand Up @@ -86,6 +87,14 @@ public void setLength(Integer length) {
this.length = length.longValue();
}

public Integer getArrayLength() {
return arrayLength;
}

public void setArrayLength(Integer arrayLength) {
this.arrayLength = arrayLength;
}

public Value getValue() {
return value;
}
Expand Down Expand Up @@ -392,13 +401,15 @@ Size calculateColumnSize(Dialect dialect, Mapping mapping) {
throw new AssertionFailure( "no typing information available to determine column size" );
}
final JdbcMapping jdbcMapping = (JdbcMapping) type;
return dialect.getSizeStrategy().resolveSize(
Size size = dialect.getSizeStrategy().resolveSize(
jdbcMapping.getJdbcType(),
jdbcMapping.getJdbcJavaType(),
precision,
scale,
length
);
size.setArrayLength( arrayLength );
return size;
}

private Type getTypeForComponentValue(Mapping mapping, Type type, int typeIndex) {
Expand Down Expand Up @@ -675,6 +686,7 @@ public Column clone() {
copy.length = length;
copy.precision = precision;
copy.scale = scale;
copy.arrayLength = arrayLength;
copy.value = value;
copy.typeIndex = typeIndex;
copy.name = name;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ public void alignColumns() {
referencingColumn.setLength( referencedColumn.getLength() );
referencingColumn.setScale( referencedColumn.getScale() );
referencingColumn.setPrecision( referencedColumn.getPrecision() );
referencingColumn.setArrayLength( referencedColumn.getArrayLength() );
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6130,7 +6130,8 @@ public void visitCastTarget(CastTarget castTarget) {
);
final String arrayTypeName = dialect.getArrayTypeName(
javaTypeDescriptor.getElementJavaType().getJavaTypeClass().getSimpleName(),
elementTypeName
elementTypeName,
null
);
if ( arrayTypeName != null ) {
appendSql( arrayTypeName );
Expand Down

0 comments on commit a56942c

Please sign in to comment.