简体   繁体   中英

Spring liquibase custom ImplicitNamingStrategy

I want to be able to set a naming strategy for foreign keys, currently keys are named like FK_qsp8qs9j1wbh965jtxfbu2q2u and I'd like to generate names like FK_TABLE1_TABLE2 I written the following naming strategy:

@Component
public class CustomImplicitNamingStrategy extends SpringImplicitNamingStrategy {

    @Override
    public Identifier determineForeignKeyName(ImplicitForeignKeyNameSource source) {
        Identifier userProvidedIdentifier = source.getUserProvidedIdentifier();

        if (userProvidedIdentifier != null) {
            return userProvidedIdentifier;
        }
        String foreignKey = format("FK_%s_%s", source.getTableName().getText(), source.getReferencedTableName().getText());

        return Identifier.toIdentifier(foreignKey);
    }

}

application.properties

spring.jpa.hibernate.naming.implicit-strategy=foo.bar.CustomImplicitNamingStrategy 

liquibase.properties

referenceUrl=hibernate:spring:foo.bar.model?dialect=org.hibernate.dialect.Oracle10gDialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=foo.bar.CustomImplicitNamingStrategy

pom.xml

    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>

        <!--   Liquibase plugin configuration  -->
        <plugin>
            <groupId>org.liquibase</groupId>
            <artifactId>liquibase-maven-plugin</artifactId>
            <version>3.4.1</version>
            <configuration>
                <referenceUrl>
                    hibernate:spring:foo.bar.model?dialect=org.hibernate.dialect.Oracle10gDialect&hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&hibernate.implicit_naming_strategy=foo.bar.CustomImplicitNamingStrategy
                </referenceUrl>
                <propertyFile>${project.basedir}/src/main/resources/liquibase.properties</propertyFile>
                <diffChangeLogFile>
                    ${project.basedir}/src/main/resources/db/changelogs/${maven.build.timestamp}_changelog.xml
                </diffChangeLogFile>
                <changeLogFile>
                    ${project.basedir}/src/main/resources/db/changelogs/db.changelog-master.xml
                </changeLogFile>
                <logging>info</logging>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.liquibase.ext</groupId>
                    <artifactId>liquibase-hibernate4</artifactId>
                    <version>3.5</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-beans</artifactId>
                    <version>4.1.7.RELEASE</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework.data</groupId>
                    <artifactId>spring-data-jpa</artifactId>
                    <version>1.7.3.RELEASE</version>
                </dependency>
                <dependency>
                    <groupId>com.h2database</groupId>
                    <artifactId>h2</artifactId>
                    <version>1.4.198</version>
                </dependency>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-aspects</artifactId>
                    <version>4.1.7.RELEASE</version>
                </dependency>
            </dependencies>
        </plugin>

    </plugins>

It seems regardless of the configuration liquibase falls back to ImplicitNamingStrategyJpaCompliantImpl and ignores the custom one.

I found, that the parameters for the naming-strategies are not used in the liquibase-hibernate4 package.

My solution is to use the libquibase-hibernate5 (5 instead of 4) in the latest version available on maven-central (3.8):

<dependency>
    <groupId>org.liquibase.ext</groupId>
    <artifactId>liquibase-hibernate5</artifactId>
    <version>3.8</version>
</dependency>

The complete plugin definition in the pom.xml is:

<!-- database migration with liquibase -->
<plugin>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>3.8.9</version>
    <configuration>
        <propertyFileWillOverride>true</propertyFileWillOverride>
        <propertyFile>src/main/resources/db/liquibase.properties</propertyFile>
        <diffChangeLogFile>src/main/resources/db/changes/${maven.build.timestamp}_changelog.xml</diffChangeLogFile>
        <verbose>true</verbose>
        <logging>debug</logging>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.liquibase.ext</groupId>
            <artifactId>liquibase-hibernate5</artifactId>
            <version>3.8</version>
        </dependency>
        <dependency>
            <groupId>org.javassist</groupId>
            <artifactId>javassist</artifactId>
            <version>3.20.0-GA</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>2.1.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>de.meisterbohne.framework</groupId>
            <artifactId>meisterbohne-spring-base</artifactId>
            <version>1.0.3</version>
        </dependency>
    </dependencies>
</plugin>

Additionally, I upgraded liquibase-core to the latest version (3.8.9), by overriding the Spring default from the parent pom, with the following property in pom.xml :

<properties>
    <liquibase.version>3.8.9</liquibase.version>
</properties>

In liquibase.properties you can set the referenceUrl with the two additional parameters for naming-strategies:

  • hibernate.physical_naming_strategy
  • hibernate.implicit_naming_strategy

Example (I use our own naming strategies):

referenceUrl=hibernate:spring:\
de.meisterbohne.dms,\
de.meisterbohne.framework.spring\
?dialect=org.hibernate.dialect.MySQL5InnoDBDialect\
&hibernate.physical_naming_strategy=de.meisterbohne.framework.spring.common.data.names.MeisterbohnePhysicalNamingStrategy\
&hibernate.implicit_naming_strategy=de.meisterbohne.framework.spring.common.data.names.MeisterbohneImplicitNamingStrategy

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM