Browse Source

Pull request #2031: DEC-17827 feat: 多租户合并

Merge in CORE/base-third from ~ELIJAH/base-third:release/10.0 to release/10.0

* commit '55d87f160e59415099bd554902329f0e71e76120':
  DEC-14578 feat: hibernate二级缓存卡顿
  DEC-14578 feat: hibernate自动删除旧唯一键
  DEC-14578 feat: 使hibernate支持主键的自动更新
  DEC-14578 feat: 去掉无用的jetbrain.NotNull依赖, 拆分Utils方法
  QFX-1737 fix:数据上传之后报错
  DEC-14578 打包脚本
  DEC-14578 引入com.alibaba:transmittable-thread-local
release/10.0
Elijah 4 years ago
parent
commit
094dfd02a3
  1. 2
      base-third-project/base-third-step8/pom.xml
  2. 5
      fine-ehcache/src/main/java/com/fr/third/net/sf/ehcache/pool/builtin-sizeof.filter
  3. 5
      fine-hibernate/src/main/java/com/fr/third/org/hibernate/dialect/Dialect.java
  4. 16
      fine-hibernate/src/main/java/com/fr/third/org/hibernate/dialect/MySQLDialect.java
  5. 5
      fine-hibernate/src/main/java/com/fr/third/org/hibernate/dialect/unique/DefaultUniqueDelegate.java
  6. 23
      fine-hibernate/src/main/java/com/fr/third/org/hibernate/dialect/unique/MySQLUniqueDelegate.java
  7. 20
      fine-hibernate/src/main/java/com/fr/third/org/hibernate/tool/schema/extract/internal/IndexInformationImpl.java
  8. 18
      fine-hibernate/src/main/java/com/fr/third/org/hibernate/tool/schema/extract/internal/InformationExtractorJdbcDatabaseMetaDataImpl.java
  9. 2
      fine-hibernate/src/main/java/com/fr/third/org/hibernate/tool/schema/extract/spi/IndexInformation.java
  10. 104
      fine-hibernate/src/main/java/com/fr/third/org/hibernate/tool/schema/internal/AbstractSchemaMigrator.java
  11. 3
      fine-hibernate/src/main/java/com/fr/third/org/hibernate/tool/schema/internal/GroupedSchemaMigratorImpl.java
  12. 3
      fine-hibernate/src/main/java/com/fr/third/org/hibernate/tool/schema/internal/IndividuallySchemaMigratorImpl.java
  13. 63
      fine-hibernate/src/main/java/com/fr/third/org/hibernate/tool/schema/internal/StandardPrimaryKeyExporter.java

2
base-third-project/base-third-step8/pom.xml

@ -7,7 +7,7 @@
<parent>
<groupId>com.fr.third</groupId>
<artifactId>base-third</artifactId>
<version>${revision}</version>
<version>10.0-FEATURE-SNAPSHOT</version>
</parent>
<artifactId>step8</artifactId>

5
fine-ehcache/src/main/java/com/fr/third/net/sf/ehcache/pool/builtin-sizeof.filter vendored

@ -22,6 +22,11 @@ com.fr.third.org.hibernate.cache.spi.QueryKey.tenantIdentifier
com.fr.third.org.hibernate.engine.spi.TypedValue.type
com.fr.third.org.hibernate.engine.spi.TypedValue.entityMode
# Hibernate 5.x Second Level Entity/Collection Caching
com.fr.third.org.hibernate.cache.internal.CacheKeyImplementation.type
com.fr.third.org.hibernate.cache.internal.CacheKeyImplementation.entityOrRoleName
com.fr.third.org.hibernate.cache.internal.CacheKeyImplementation.tenantId
# This TC internal field is shared amongst all clustered entries
org.terracotta.cache.serialization.SerializedEntry.tcClazz
com.tc.object.TCObjectSelfImpl.tcClazz

5
fine-hibernate/src/main/java/com/fr/third/org/hibernate/dialect/Dialect.java

@ -2099,6 +2099,11 @@ public abstract class Dialect implements ConversionContext {
return " add constraint " + constraintName + " primary key ";
}
public String getDropPrimaryKeyConstraintString(String constraintName) {
return " drop constraint " + constraintName;
}
/**
* Does the database/driver have bug in deleting rows that refer to other rows being deleted in the same query?
*

16
fine-hibernate/src/main/java/com/fr/third/org/hibernate/dialect/MySQLDialect.java

@ -22,6 +22,8 @@ import com.fr.third.org.hibernate.dialect.identity.MySQLIdentityColumnSupport;
import com.fr.third.org.hibernate.dialect.pagination.AbstractLimitHandler;
import com.fr.third.org.hibernate.dialect.pagination.LimitHandler;
import com.fr.third.org.hibernate.dialect.pagination.LimitHelper;
import com.fr.third.org.hibernate.dialect.unique.MySQLUniqueDelegate;
import com.fr.third.org.hibernate.dialect.unique.UniqueDelegate;
import com.fr.third.org.hibernate.engine.spi.RowSelection;
import com.fr.third.org.hibernate.exception.LockAcquisitionException;
import com.fr.third.org.hibernate.exception.LockTimeoutException;
@ -43,6 +45,8 @@ import com.fr.third.org.hibernate.type.StandardBasicTypes;
@SuppressWarnings("deprecation")
public class MySQLDialect extends Dialect {
private final UniqueDelegate uniqueDelegate;
private static final LimitHandler LIMIT_HANDLER = new AbstractLimitHandler() {
@Override
public String processSql(String sql, RowSelection selection) {
@ -196,6 +200,8 @@ public class MySQLDialect extends Dialect {
getDefaultProperties().setProperty( Environment.MAX_FETCH_DEPTH, "2" );
getDefaultProperties().setProperty( Environment.STATEMENT_BATCH_SIZE, DEFAULT_BATCH_SIZE );
uniqueDelegate = new MySQLUniqueDelegate( this );
}
protected void registerVarcharTypes() {
@ -234,6 +240,11 @@ public class MySQLDialect extends Dialect {
);
}
@Override
public String getDropPrimaryKeyConstraintString(String constraintName) {
return " drop primary key ";
}
@Override
public boolean supportsLimit() {
return true;
@ -422,6 +433,11 @@ public class MySQLDialect extends Dialect {
return ps.getResultSet();
}
@Override
public UniqueDelegate getUniqueDelegate() {
return uniqueDelegate;
}
@Override
public boolean supportsRowValueConstructorSyntax() {
return true;

5
fine-hibernate/src/main/java/com/fr/third/org/hibernate/dialect/unique/DefaultUniqueDelegate.java

@ -85,7 +85,7 @@ public class DefaultUniqueDelegate implements UniqueDelegate {
final StringBuilder buf = new StringBuilder( "alter table " );
buf.append( tableName );
buf.append(" drop constraint " );
buf.append(getDropUnique());
if ( dialect.supportsIfExistsBeforeConstraintName() ) {
buf.append( "if exists " );
}
@ -96,4 +96,7 @@ public class DefaultUniqueDelegate implements UniqueDelegate {
return buf.toString();
}
protected String getDropUnique(){
return " drop constraint ";
}
}

23
fine-hibernate/src/main/java/com/fr/third/org/hibernate/dialect/unique/MySQLUniqueDelegate.java

@ -0,0 +1,23 @@
package com.fr.third.org.hibernate.dialect.unique;
import com.fr.third.org.hibernate.dialect.Dialect;
/**
* @author Andrea Boriero
*/
public class MySQLUniqueDelegate extends DefaultUniqueDelegate {
/**
* Constructs MySQLUniqueDelegate
*
* @param dialect The dialect for which we are handling unique constraints
*/
public MySQLUniqueDelegate(Dialect dialect) {
super( dialect );
}
@Override
protected String getDropUnique() {
return " drop index ";
}
}

20
fine-hibernate/src/main/java/com/fr/third/org/hibernate/tool/schema/extract/internal/IndexInformationImpl.java

@ -21,12 +21,19 @@ import com.fr.third.org.hibernate.tool.schema.spi.SchemaManagementException;
public class IndexInformationImpl implements IndexInformation {
private final Identifier indexIdentifier;
private final List<ColumnInformation> columnList;
private boolean unique;
public IndexInformationImpl(Identifier indexIdentifier, List<ColumnInformation> columnList) {
this.indexIdentifier = indexIdentifier;
this.columnList = columnList;
}
public IndexInformationImpl(Identifier indexIdentifier, List<ColumnInformation> columnList, boolean unique) {
this.indexIdentifier = indexIdentifier;
this.columnList = columnList;
this.unique = unique;
}
@Override
public Identifier getIndexIdentifier() {
return indexIdentifier;
@ -37,6 +44,11 @@ public class IndexInformationImpl implements IndexInformation {
return columnList;
}
@Override
public boolean isUnique() {
return unique;
}
public static Builder builder(Identifier indexIdentifier) {
return new Builder( indexIdentifier );
}
@ -44,6 +56,7 @@ public class IndexInformationImpl implements IndexInformation {
public static class Builder {
private final Identifier indexIdentifier;
private final List<ColumnInformation> columnList = new ArrayList<ColumnInformation>();
private boolean unique;
public Builder(Identifier indexIdentifier) {
this.indexIdentifier = indexIdentifier;
@ -54,13 +67,18 @@ public class IndexInformationImpl implements IndexInformation {
return this;
}
public Builder setUnique(boolean unique) {
this.unique = unique;
return this;
}
public IndexInformationImpl build() {
if ( columnList.isEmpty() ) {
throw new SchemaManagementException(
"Attempt to resolve JDBC metadata failed to find columns for index [" + indexIdentifier.getText() + "]"
);
}
return new IndexInformationImpl( indexIdentifier, Collections.unmodifiableList( columnList ) );
return new IndexInformationImpl( indexIdentifier, Collections.unmodifiableList( columnList ), unique);
}
}
}

18
fine-hibernate/src/main/java/com/fr/third/org/hibernate/tool/schema/extract/internal/InformationExtractorJdbcDatabaseMetaDataImpl.java

@ -710,6 +710,24 @@ public class InformationExtractorJdbcDatabaseMetaDataImpl implements Information
}
try {
//处理唯一键
ResultSet uniqueKeyResult = extractionContext.getJdbcDatabaseMetaData().getIndexInfo(catalogFilter, schemaFilter, tableName.getTableName().getText(), true, true);
try {
while (uniqueKeyResult.next()) {
if ( uniqueKeyResult.getShort("TYPE") == DatabaseMetaData.tableIndexStatistic ) {
continue;
}
final Identifier indexIdentifier = DatabaseIdentifier.toIdentifier(uniqueKeyResult.getString("INDEX_NAME"));
IndexInformationImpl.Builder builder = builders.get( indexIdentifier );
if ( builder == null ) {
builder = IndexInformationImpl.builder( indexIdentifier ).setUnique(true);
builders.put( indexIdentifier, builder );
}
}
} finally {
uniqueKeyResult.close();
}
ResultSet resultSet = extractionContext.getJdbcDatabaseMetaData().getIndexInfo(
catalogFilter,
schemaFilter,

2
fine-hibernate/src/main/java/com/fr/third/org/hibernate/tool/schema/extract/spi/IndexInformation.java

@ -30,4 +30,6 @@ public interface IndexInformation {
* @return The columns
*/
public List<ColumnInformation> getIndexedColumns();
boolean isUnique();
}

104
fine-hibernate/src/main/java/com/fr/third/org/hibernate/tool/schema/internal/AbstractSchemaMigrator.java

@ -6,12 +6,6 @@
*/
package com.fr.third.org.hibernate.tool.schema.internal;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import com.fr.third.org.hibernate.boot.Metadata;
import com.fr.third.org.hibernate.boot.model.naming.Identifier;
import com.fr.third.org.hibernate.boot.model.relational.AuxiliaryDatabaseObject;
@ -26,17 +20,21 @@ import com.fr.third.org.hibernate.engine.config.spi.StandardConverters;
import com.fr.third.org.hibernate.engine.jdbc.internal.FormatStyle;
import com.fr.third.org.hibernate.engine.jdbc.internal.Formatter;
import com.fr.third.org.hibernate.internal.util.StringHelper;
import com.fr.third.org.hibernate.mapping.Column;
import com.fr.third.org.hibernate.mapping.Constraint;
import com.fr.third.org.hibernate.mapping.ForeignKey;
import com.fr.third.org.hibernate.mapping.Index;
import com.fr.third.org.hibernate.mapping.PrimaryKey;
import com.fr.third.org.hibernate.mapping.Table;
import com.fr.third.org.hibernate.mapping.UniqueKey;
import com.fr.third.org.hibernate.resource.transaction.spi.DdlTransactionIsolator;
import com.fr.third.org.hibernate.tool.hbm2ddl.UniqueConstraintSchemaUpdateStrategy;
import com.fr.third.org.hibernate.tool.schema.extract.spi.ColumnInformation;
import com.fr.third.org.hibernate.tool.schema.extract.spi.DatabaseInformation;
import com.fr.third.org.hibernate.tool.schema.extract.spi.ForeignKeyInformation;
import com.fr.third.org.hibernate.tool.schema.extract.spi.IndexInformation;
import com.fr.third.org.hibernate.tool.schema.extract.spi.NameSpaceTablesInformation;
import com.fr.third.org.hibernate.tool.schema.extract.spi.PrimaryKeyInformation;
import com.fr.third.org.hibernate.tool.schema.extract.spi.SequenceInformation;
import com.fr.third.org.hibernate.tool.schema.extract.spi.TableInformation;
import com.fr.third.org.hibernate.tool.schema.internal.exec.GenerationTarget;
@ -48,9 +46,15 @@ import com.fr.third.org.hibernate.tool.schema.spi.SchemaFilter;
import com.fr.third.org.hibernate.tool.schema.spi.SchemaManagementException;
import com.fr.third.org.hibernate.tool.schema.spi.SchemaMigrator;
import com.fr.third.org.hibernate.tool.schema.spi.TargetDescriptor;
import com.fr.third.org.jboss.logging.Logger;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static com.fr.third.org.hibernate.cfg.AvailableSettings.UNIQUE_CONSTRAINT_SCHEMA_UPDATE_STRATEGY;
/**
@ -355,6 +359,29 @@ public abstract class AbstractSchemaMigrator implements SchemaMigrator {
if ( uniqueConstraintStrategy != UniqueConstraintSchemaUpdateStrategy.SKIP ) {
final Exporter<Constraint> exporter = dialect.getUniqueKeyExporter();
Set<Identifier> identifiers = getUniqueKeyIdentifiers(table);
if (tableInfo != null) {
for (IndexInformation indexInfo : tableInfo.getIndexes()) {
if (!indexInfo.isUnique() || indexInfo.getIndexIdentifier().equals(tableInfo.getPrimaryKey().getPrimaryKeyIdentifier())) {
continue;
}
//如果旧的唯一键已经不存在, 则删除
if (!identifiers.contains(indexInfo.getIndexIdentifier())) {
log.warn("delete unique key not existed in entity: " + indexInfo.getIndexIdentifier().getText());
UniqueKey old = new UniqueKey();
old.setTable(table);
old.setName(indexInfo.getIndexIdentifier().getText());
applySqlStrings(
true,
exporter.getSqlDropStrings(old, metadata),
formatter,
options,
targets
);
}
}
}
final Iterator ukItr = table.getUniqueKeyIterator();
while ( ukItr.hasNext() ) {
final UniqueKey uniqueKey = (UniqueKey) ukItr.next();
@ -388,6 +415,18 @@ public abstract class AbstractSchemaMigrator implements SchemaMigrator {
}
}
private Set<Identifier> getUniqueKeyIdentifiers(Table table) {
Set<Identifier> identifiers = new HashSet<>();
Iterator<UniqueKey> uniqueKeys = table.getUniqueKeyIterator();
while (uniqueKeys.hasNext()) {
UniqueKey uniqueKey = uniqueKeys.next();
if (StringHelper.isNotEmpty(uniqueKey.getName())) {
identifiers.add(Identifier.toIdentifier(uniqueKey.getName()));
}
}
return identifiers;
}
private UniqueConstraintSchemaUpdateStrategy determineUniqueConstraintSchemaUpdateStrategy(Metadata metadata) {
final ConfigurationService cfgService = ((MetadataImplementor) metadata).getMetadataBuildingOptions()
.getServiceRegistry()
@ -446,6 +485,57 @@ public abstract class AbstractSchemaMigrator implements SchemaMigrator {
return tableInformation.getForeignKey( Identifier.toIdentifier( foreignKey.getName() ) );
}
protected void applyPrimaryKey(
Table table,
TableInformation tableInfo,
Dialect dialect,
Metadata metadata,
Formatter formatter,
ExecutionOptions options,
GenerationTarget... targets) {
try {
PrimaryKey primaryKey = table.getPrimaryKey();
if (primaryKey == null) {
return;
}
Exporter<PrimaryKey> exporter = new StandardPrimaryKeyExporter(dialect);
PrimaryKeyInformation existedPrimaryKeyInfo = tableInfo.getPrimaryKey();
if (existedPrimaryKeyInfo == null) {
applySqlStrings(true, exporter.getSqlCreateStrings(primaryKey, metadata), formatter, options, targets);
} else if (!columnEquals(table.getPrimaryKey().getColumns(), existedPrimaryKeyInfo.getColumns())) {
//主键列不匹配, 先删再增
PrimaryKey deletedKey = copyPrimaryKey(tableInfo.getPrimaryKey().getPrimaryKeyIdentifier().getText(), table);
applySqlStrings(true, exporter.getSqlDropStrings(deletedKey, metadata), formatter, options, targets);
applySqlStrings(true, exporter.getSqlCreateStrings(primaryKey, metadata), formatter, options, targets);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
private PrimaryKey copyPrimaryKey(String newName, Table table) {
PrimaryKey copy = new PrimaryKey(table);
copy.setName(newName);
return copy;
}
private boolean columnEquals(List<Column> columns, Iterable<ColumnInformation> iterator) {
int count = 0;
Set<String> names = new HashSet<String>();
for (Column column: columns) {
names.add(column.getName().toLowerCase());
}
for (ColumnInformation columnInformation : iterator) {
String name = columnInformation.getColumnIdentifier().getText();
if (!names.contains(name.toLowerCase())) {
return false;
}
count++;
}
return count == columns.size();
}
protected void checkExportIdentifier(Exportable exportable, Set<String> exportIdentifiers) {
final String exportIdentifier = exportable.getExportIdentifier();
if ( exportIdentifiers.contains( exportIdentifier ) ) {

3
fine-hibernate/src/main/java/com/fr/third/org/hibernate/tool/schema/internal/GroupedSchemaMigratorImpl.java

@ -83,6 +83,9 @@ public class GroupedSchemaMigratorImpl extends AbstractSchemaMigrator {
if ( tableInformation == null || ( tableInformation != null && tableInformation.isPhysicalTable() ) ) {
applyIndexes( table, tableInformation, dialect, metadata, formatter, options, targets );
applyUniqueKeys( table, tableInformation, dialect, metadata, formatter, options, targets );
if (tableInformation != null) {
applyPrimaryKey(table, tableInformation, dialect, metadata, formatter, options, targets);
}
}
}
}

3
fine-hibernate/src/main/java/com/fr/third/org/hibernate/tool/schema/internal/IndividuallySchemaMigratorImpl.java

@ -83,6 +83,9 @@ public class IndividuallySchemaMigratorImpl extends AbstractSchemaMigrator {
if ( tableInformation == null || ( tableInformation != null && tableInformation.isPhysicalTable() ) ) {
applyIndexes( table, tableInformation, dialect, metadata, formatter, options, targets );
applyUniqueKeys( table, tableInformation, dialect, metadata, formatter, options, targets );
if (tableInformation != null) {
applyPrimaryKey(table, tableInformation, dialect, metadata, formatter, options, targets);
}
}
}
}

63
fine-hibernate/src/main/java/com/fr/third/org/hibernate/tool/schema/internal/StandardPrimaryKeyExporter.java

@ -0,0 +1,63 @@
package com.fr.third.org.hibernate.tool.schema.internal;
import com.fr.third.org.hibernate.boot.Metadata;
import com.fr.third.org.hibernate.dialect.Dialect;
import com.fr.third.org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import com.fr.third.org.hibernate.mapping.Column;
import com.fr.third.org.hibernate.mapping.PrimaryKey;
import com.fr.third.org.hibernate.tool.schema.spi.Exporter;
import java.util.Iterator;
/**
* @author Elijah
* @version 10.5
* Created by Elijah on 2020/9/30
*/
public class StandardPrimaryKeyExporter implements Exporter<PrimaryKey> {
private Dialect dialect;
public StandardPrimaryKeyExporter(Dialect dialect) {
this.dialect = dialect;
}
@Override
public String[] getSqlCreateStrings(PrimaryKey primaryKey, Metadata metadata) {
final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment();
final String tableName = jdbcEnvironment.getQualifiedObjectNameFormatter().format(
primaryKey.getTable().getQualifiedTableName(),
dialect
);
final String constraintName = dialect.quote( primaryKey.getName() );
return new String[]{ "alter table " + tableName + dialect.getAddPrimaryKeyConstraintString(constraintName) + " " + columnsToString( primaryKey ) };
}
protected String columnsToString(PrimaryKey primaryKey) {
final StringBuilder sb = new StringBuilder();
sb.append( " (" );
final Iterator<Column> columnIterator = primaryKey.columnIterator();
while ( columnIterator.hasNext() ) {
final Column column = columnIterator.next();
sb.append( column.getQuotedName( dialect ) );
if ( columnIterator.hasNext() ) {
sb.append( ", " );
}
}
return sb.append( ')' ).toString();
}
@Override
public String[] getSqlDropStrings(PrimaryKey primaryKey, Metadata metadata) {
final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment();
final String tableName = jdbcEnvironment.getQualifiedObjectNameFormatter().format(
primaryKey.getTable().getQualifiedTableName(),
dialect
);
final StringBuilder buf = new StringBuilder( "alter table " );
buf.append( tableName );
buf.append(dialect.getDropPrimaryKeyConstraintString(dialect.quote( primaryKey.getName())));
return new String[] { buf.toString() };
}
}
Loading…
Cancel
Save