【问题标题】:How do i create new table in database from same entity JPA Spring boot?如何从同一实体 JPA Spring boot 在数据库中创建新表?
【发布时间】:2021-10-25 16:33:04
【问题描述】:

如果当天是当天的新创建表,我想每天创建一个以完整日期作为表名的新表

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

@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="") 的名称作为一个根据日期动态传递的变量。

【问题讨论】:

  • 我想不出一个解决方案可以让您做到这一点并获得 JPA 抽象的好处。但是,您可以采用裸机路径并编写一些带有无限循环的可运行文件,该无限循环检查时间并每天创建一个新表。或者也许做某种 cronjob 或类似的事情。您能否提供有关您的业务逻辑的更多信息?因为您可能能够以一种您不必编写如此骇人听闻的解决方案的方式重新架构您的数据库。
  • 这是不可能的。看起来您正在尝试在 JPA 级别上创建分区。为什么不使用数据库功能?你用的是什么数据库?
  • 我正在使用 mysql
  • @Simon Martinelli 简而言之,我想每天自动创建一个具有上述相同列的新表,而无需更改 @Table() 注释中的名称字符串
  • 这在数据库世界中被称为分区。请阅读文档。并且应该使用数据库而不是 JPA 来完成(尽管 JPA 根本不能这样做)dev.mysql.com/doc/refman/8.0/en/partitioning.html

标签: spring spring-boot jpa spring-data-jpa


【解决方案1】:

您可以通过扩展 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());
  }
}

在您的 application.properties 中注册它:

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

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


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

【讨论】:

  • 我必须在同一个实体类中添加这段代码还是创建一个新类?请帮忙
  • 您必须创建一个扩展 SpringPhysicalNamingStrategy 的新类,并将完全限定的类名提供给 spring.jpa.hibernate.naming.physical-strategy。在我的示例中,类名为 TableNamingStrategy,包为 com.stackoverflow.questions,但您可以为该类指定您喜欢的任何名称,并相应地调整您的 application.properties 文件。
  • 嘿,我有一个简单的问题,可以每 24 小时安排一次此功能,以便在不重新启动服务器的情况下自动创建一个新表
  • 还有一件事我想为另一个具有相同 **_Date 格式的表再做一个函数我也可以这样做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 2020-02-08
  • 2011-12-29
  • 2021-04-14
相关资源
最近更新 更多