我如何从同一实体 JPA Spring 引导在数据库中创建新的 table?

How do i create new table in database from same entity JPA Spring boot?

我想每天创建一个新的 table 并使用完整日期作为 table 名称,如果这一天是新的,则为那一天创建 table

我已经看到,当我将@Table(name="") 名称更改为新字符串时,它会创建一个新的 table,但我无法自动完成这项工作

@Entity
@Table(name="orders_25_10_2021")
public class game2data {
@Id
private int cid;
private String name;
private Integer address;
private Integer gender;
private String date;
private String Done;

简单来说,我想根据日期将@Table(name="") 的名称作为动态变量传递。

您可以通过扩展 SpringPhysicalNamingStrategy 并覆盖其 toPhysicalTableName 方法来实现此自定义命名策略:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TableNamingStrategy extends SpringPhysicalNamingStrategy {
  private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("dd_MM_YYYY");
  public static final PhysicalNamingStrategyStandardImpl INSTANCE =
      new PhysicalNamingStrategyStandardImpl();

  @Override
  public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
    if (!name.getText().equals("game2data"))
      return name;
    StringBuilder customName =
        new StringBuilder("orders").append('_').append(DATE_FORMATTER.format(LocalDate.now()));
    return new Identifier(customName.toString(), name.isQuoted());
  }
}

and 将其注册到您的 application.properties:

spring.jpa.hibernate.naming.physical-strategy=com.Whosebug.questions.TableNamingStrategy

从 game2data 实体中删除 @Table 注释。
此方法受限于table names are determined at application start-up.


作为概念验证,here's a way 通过扩展 StatementInspector 每天更新 table 名称。通过使用它,您将无法读取旧数据。在每天向其中插入数据之前,您还必须使用 JpaRepository 方法的自定义实现来创建新的 table。