如何使用Spring数据Jpa或Hibernate实现ALTER表查询
我使用Spring批处理和Spring数据(以及Hibernate)在数据库表中插入CSV文件。 每次插入CSV时,我都必须使用data jpa deleteAll()方法删除表中以前的数据。问题在于,在每个delete/insert语句之后,表的ID都会自动连续递增(@GeneratedValue(strategy=GenerationType.IDENTITY))。 我希望每次删除后,ID从1开始。我发现唯一的方法就是修改索引(我知道这不是最好的方法,所以欢迎你的建议) 问题是:如何使用Spring数据Jpa或Hibernate实现ALTER表查询,spring,hibernate,spring-data-jpa,Spring,Hibernate,Spring Data Jpa,我使用Spring批处理和Spring数据(以及Hibernate)在数据库表中插入CSV文件。 每次插入CSV时,我都必须使用data jpa deleteAll()方法删除表中以前的数据。问题在于,在每个delete/insert语句之后,表的ID都会自动连续递增(@GeneratedValue(strategy=GenerationType.IDENTITY))。 我希望每次删除后,ID从1开始。我发现唯一的方法就是修改索引(我知道这不是最好的方法,所以欢迎你的建议) 问题是: 是否有任何
是否有任何方法可以运行此SQL请求
ALTER TABLE res AUTO_INCREMENT=1;
在Java对象中使用Spring数据还是Hibernate?
谢谢是否可以在java端生成id而不使用嵌入式db自动增量功能 所以最好的方法是显式生成id并将其设置为实体 其他个案包括: 截断表 截断表名 这将重置表上的自动增量,并从该表中删除所有记录 删除并重新创建 表DROP Table_名称 创建表名{…}
因此,我认为,第二个问题是您想要的是什么,我没有改变表,而是定制了Hibernate生成ID的方式 而不是使用:
@GeneratedValue(strategy = GenerationType.IDENTITY)
我已经实现了一个自定义id生成器:
@GenericGenerator(name = "sequence_id", strategy =
"com.xyz.utils.CustomIdGenerator",
parameters = {
@org.hibernate.annotations.Parameter(
name = "table_name", value = "myTable")
})
@GeneratedValue(generator = "sequence_id")
CustomIdGenerator类:
public class CustomIdGenerator implements IdentifierGenerator,Configurable{
private String table_name ;
@Override
public Serializable generate(SharedSessionContractImplementor session, Object object)
throws HibernateException {
Connection connection = session.connection();
try {
Statement statement=connection.createStatement();
ResultSet rs=statement.executeQuery("select count(id) as Id from "
+table_name );
if(rs.next())
{
int id=rs.getInt(1)+1;
Integer generatedId = new Integer(id);
System.out.println("Generated Id: " + generatedId);
return generatedId;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
public void configure(Type type, Properties params, ServiceRegistry serviceRegistry)
throws MappingException {
setTable_name(params.getProperty("table_name")); }
//getters and setters
}
这个解决方案的问题是为每个id执行select,因此它似乎在DBMS上生成负载,而且速度很慢。
rs为第一个id()循环两次
欢迎提出任何优化建议对于此类数据库迁移,您需要使用flyway或liquidbase。您好,谢谢您的建议,但这将影响我的代码的所有逻辑和实体之间的关系。谢谢您的建议,我实现了另一种方法。见下面的答案