Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Spring数据Jpa或Hibernate实现ALTER表查询_Spring_Hibernate_Spring Data Jpa - Fatal编程技术网

如何使用Spring数据Jpa或Hibernate实现ALTER表查询

如何使用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开始。我发现唯一的方法就是修改索引(我知道这不是最好的方法,所以欢迎你的建议) 问题是: 是否有任何

我使用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。您好,谢谢您的建议,但这将影响我的代码的所有逻辑和实体之间的关系。谢谢您的建议,我实现了另一种方法。见下面的答案