HHH-15504 Add UUID support for SQL Server
This commit is contained in:
parent
69668c32b7
commit
60bd1c657b
|
@ -17,6 +17,7 @@ import org.hibernate.orm.test.jpa.BaseEntityManagerFunctionalTestCase;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -43,6 +44,11 @@ public class UuidGeneratedValueTest extends BaseEntityManagerFunctionalTestCase
|
||||||
});
|
});
|
||||||
|
|
||||||
assertNotNull(book.getId());
|
assertNotNull(book.getId());
|
||||||
|
|
||||||
|
doInJPA(this::entityManagerFactory, entityManager -> {
|
||||||
|
Book foundBook = entityManager.find( Book.class, book.getId() );
|
||||||
|
assertEquals( book.getAuthor(), foundBook.getAuthor() );
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
//tag::identifiers-generators-uuid-mapping-example[]
|
//tag::identifiers-generators-uuid-mapping-example[]
|
||||||
|
|
|
@ -20,7 +20,6 @@ import org.hibernate.dialect.identity.SQLServerIdentityColumnSupport;
|
||||||
import org.hibernate.dialect.pagination.LimitHandler;
|
import org.hibernate.dialect.pagination.LimitHandler;
|
||||||
import org.hibernate.dialect.pagination.SQLServer2005LimitHandler;
|
import org.hibernate.dialect.pagination.SQLServer2005LimitHandler;
|
||||||
import org.hibernate.dialect.pagination.SQLServer2012LimitHandler;
|
import org.hibernate.dialect.pagination.SQLServer2012LimitHandler;
|
||||||
import org.hibernate.dialect.pagination.TopLimitHandler;
|
|
||||||
import org.hibernate.dialect.sequence.NoSequenceSupport;
|
import org.hibernate.dialect.sequence.NoSequenceSupport;
|
||||||
import org.hibernate.dialect.sequence.SQLServer16SequenceSupport;
|
import org.hibernate.dialect.sequence.SQLServer16SequenceSupport;
|
||||||
import org.hibernate.dialect.sequence.SQLServerSequenceSupport;
|
import org.hibernate.dialect.sequence.SQLServerSequenceSupport;
|
||||||
|
@ -53,8 +52,11 @@ import org.hibernate.type.BasicType;
|
||||||
import org.hibernate.type.BasicTypeRegistry;
|
import org.hibernate.type.BasicTypeRegistry;
|
||||||
import org.hibernate.type.StandardBasicTypes;
|
import org.hibernate.type.StandardBasicTypes;
|
||||||
import org.hibernate.type.descriptor.java.PrimitiveByteArrayJavaType;
|
import org.hibernate.type.descriptor.java.PrimitiveByteArrayJavaType;
|
||||||
|
import org.hibernate.type.descriptor.jdbc.JdbcType;
|
||||||
import org.hibernate.type.descriptor.jdbc.SmallIntJdbcType;
|
import org.hibernate.type.descriptor.jdbc.SmallIntJdbcType;
|
||||||
|
import org.hibernate.type.descriptor.jdbc.UUIDJdbcType;
|
||||||
import org.hibernate.type.descriptor.jdbc.XmlJdbcType;
|
import org.hibernate.type.descriptor.jdbc.XmlJdbcType;
|
||||||
|
import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeRegistry;
|
||||||
import org.hibernate.type.descriptor.sql.internal.DdlTypeImpl;
|
import org.hibernate.type.descriptor.sql.internal.DdlTypeImpl;
|
||||||
import org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry;
|
import org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry;
|
||||||
|
|
||||||
|
@ -174,6 +176,26 @@ public class SQLServerDialect extends AbstractTransactSQLDialect {
|
||||||
ddlTypeRegistry.addDescriptor( new DdlTypeImpl( GEOMETRY, "geometry", this ) );
|
ddlTypeRegistry.addDescriptor( new DdlTypeImpl( GEOMETRY, "geometry", this ) );
|
||||||
ddlTypeRegistry.addDescriptor( new DdlTypeImpl( GEOGRAPHY, "geography", this ) );
|
ddlTypeRegistry.addDescriptor( new DdlTypeImpl( GEOGRAPHY, "geography", this ) );
|
||||||
ddlTypeRegistry.addDescriptor( new DdlTypeImpl( SQLXML, "xml", this ) );
|
ddlTypeRegistry.addDescriptor( new DdlTypeImpl( SQLXML, "xml", this ) );
|
||||||
|
ddlTypeRegistry.addDescriptor( new DdlTypeImpl( UUID, "uniqueidentifier", this ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JdbcType resolveSqlTypeDescriptor(
|
||||||
|
String columnTypeName,
|
||||||
|
int jdbcTypeCode,
|
||||||
|
int precision,
|
||||||
|
int scale,
|
||||||
|
JdbcTypeRegistry jdbcTypeRegistry) {
|
||||||
|
switch ( jdbcTypeCode ) {
|
||||||
|
case OTHER:
|
||||||
|
switch ( columnTypeName ) {
|
||||||
|
case "uniqueidentifier":
|
||||||
|
jdbcTypeCode = UUID;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return super.resolveSqlTypeDescriptor( columnTypeName, jdbcTypeCode, precision, scale, jdbcTypeRegistry );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -213,6 +235,7 @@ public class SQLServerDialect extends AbstractTransactSQLDialect {
|
||||||
SmallIntJdbcType.INSTANCE
|
SmallIntJdbcType.INSTANCE
|
||||||
);
|
);
|
||||||
typeContributions.contributeJdbcType( XmlJdbcType.INSTANCE );
|
typeContributions.contributeJdbcType( XmlJdbcType.INSTANCE );
|
||||||
|
typeContributions.contributeJdbcType( UUIDJdbcType.INSTANCE );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -22,3 +22,12 @@ Due to this change, schema validation errors could occur on existing databases.
|
||||||
The migration to `uuid` requires a migration expression like `cast(old as uuid)`.
|
The migration to `uuid` requires a migration expression like `cast(old as uuid)`.
|
||||||
|
|
||||||
To retain backwards compatibility, configure the setting `hibernate.type.preferred_uuid_jdbc_type` to `BINARY`.
|
To retain backwards compatibility, configure the setting `hibernate.type.preferred_uuid_jdbc_type` to `BINARY`.
|
||||||
|
|
||||||
|
=== UUID mapping changes on SQL Server
|
||||||
|
|
||||||
|
On SQL Server, the type code `SqlType.UUID` now by default refers to the DDL type `uniqueidentifier`, whereas before it was using `binary(16)`.
|
||||||
|
Due to this change, schema validation errors could occur on existing databases.
|
||||||
|
|
||||||
|
The migration to `uuid` requires a migration expression like `cast(old as uuid)`.
|
||||||
|
|
||||||
|
To retain backwards compatibility, configure the setting `hibernate.type.preferred_uuid_jdbc_type` to `BINARY`.
|
||||||
|
|
Loading…
Reference in New Issue