gpt4 book ai didi

java - 使用 hibernate 以编程方式验证架构

转载 作者:行者123 更新时间:2023-11-30 06:41:53 25 4
gpt4 key购买 nike

在大多数项目中,使用模式验证运行 java 应用程序 的方式是使用该配置(使用 spring 时):

spring.jpa.hibernate.ddl-auto=validate

我遇到了一个问题,我需要在运行期间的特定时间验证我的模式,有什么方法可以实现吗?

我看到 hibernate 使用 AbstractSchemaValidator 管理它,我正在使用 spring 和 hibernate,但我没有找到任何如何处理它的信息,
我唯一找到的是 How to validate database schema programmatically in hibernate with annotations? , 但它在旧版本的 spring-boot

中被删除
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>2.0.4.RELEASE</version>
</dependency>

有什么想法吗?

最佳答案

这是解决方案,如果您的用例需要:

  • 对模式的哪一部分应该进行精细和明确的控制验证
  • 需要验证多个模式
  • 需要验证服务未使用的架构,计划的 validator 正在运行
  • 应用程序使用的数据库连接不应以任何方式受到验证的影响(意思是,您不想从主连接池借用连接)

如果以上适用于您的需求,那么这是如何进行计划模式验证的示例:

  1. 来源
@SpringBootApplication
@EnableScheduling
@EnableConfigurationProperties(ScheamValidatorProperties.class)
public class SchemaValidatorApplication {
public static void main(String[] args) {
SpringApplication.run(SchemaValidatorApplication.class, args);
}
}

@ConfigurationProperties("schema-validator")
class ScheamValidatorProperties {
public Map<String, String> settings = new HashMap<>();

public ScheamValidatorProperties() {
}

public Map<String, String> getSettings() {
return this.settings;
}

public void setSome(Map<String, String> settings) {
this.settings = settings;
}
}

@Component
class ScheduledSchemaValidator {

private ScheamValidatorProperties props;

public ScheduledSchemaValidator(ScheamValidatorProperties props) {
this.props = props;
}

@Scheduled(cron = "0 0/1 * * * ?")
public void validateSchema() {
StandardServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
.applySettings(props.getSettings())
.build();

Metadata metadata = new MetadataSources(serviceRegistry)
.addAnnotatedClass(Entity1.class)
.addAnnotatedClass(Entity2.class)
.buildMetadata();

try {
new SchemaValidator().validate(metadata, serviceRegistry);
} catch (Exception e) {
System.out.println("Validation failed: " + e.getMessage());
} finally {
StandardServiceRegistryBuilder.destroy(serviceRegistry);
}
}
}

@Entity
@Table(name = "table1")
class Entity1 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

Entity1() {}

public Long getId() {
return id;
}

}

@Entity
@Table(name = "table2")
class Entity2 {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

Entity2() {}

public Long getId() {
return id;
}
}
  1. schema.sql
CREATE DATABASE IF NOT EXISTS testdb;

CREATE TABLE IF NOT EXISTS `table1` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
);

CREATE TABLE IF NOT EXISTS `table2` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
);

  1. application.yml
spring:
cache:
type: none
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3309/testdb?useSSL=false&nullNamePatternMatchesAll=true&serverTimezone=UTC&allowPublicKeyRetrieval=true
username: test_user
password: test_password
testWhileIdle: true
validationQuery: SELECT 1
jpa:
show-sql: false
database-platform: org.hibernate.dialect.MySQL8Dialect
hibernate:
ddl-auto: none
naming:
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
implicit-strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
properties:
hibernate.dialect: org.hibernate.dialect.MySQL8Dialect
hibernate.cache.use_second_level_cache: false
hibernate.cache.use_query_cache: false
hibernate.generate_statistics: false
hibernate.hbm2ddl.auto: validate

schema-validator:
settings:
connection.driver_class: com.mysql.cj.jdbc.Driver
hibernate.dialect: org.hibernate.dialect.MySQL8Dialect
hibernate.connection.url: jdbc:mysql://localhost:3309/testdb?autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
hibernate.connection.username: test_user
hibernate.connection.password: test_password
hibernate.default_schema: testdb

  1. docker-compose.yml
version: '3.0'

services:
db:
image: mysql:8.0.14
restart: always
ports:
- 3309:3306
environment:
MYSQL_ROOT_PASSWORD: test_password
MYSQL_DATABASE: testdb
MYSQL_USER: test_user
MYSQL_PASSWORD: test_password

关于java - 使用 hibernate 以编程方式验证架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54464978/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com