当前位置: 首页 > 知识库问答 >
问题:

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

钮长恨
2023-03-14

我使用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?谢谢

共有2个答案

戈念
2023-03-14

我没有改变表,而是定制了Hibernate生成Ids的方式。

而不是使用:

@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执行选择,所以它似乎在数据库管理系统上产生负载,并且速度很慢。

梁兴文
2023-03-14

是否可以在java端生成id而不使用嵌入式db自动增量功能?

所以最好的方法是显式生成id并将其设置为实体。

其他情况有:

截断表

截断表名;

这将重置表上的自动增量,并从该表中删除所有记录。

删除并重新创建

表DROP Table_名称;

创建表table_name{...};

所以我想,第二个是你在找什么

 类似资料:
  • 我有一个这样的实体层次结构。除了一些常见属性外,一些属性仅由少数子类型共享: 使用QueryDSL,我试图根据动态筛选标准搜索人员,如: 这似乎不是正确的方式,然而,我得到了很多错误,比如“薪水”不是一个人的成员。 处理层次实体搜索的各种方法有哪些?为了类型安全,我更喜欢QueryDSL,但使用Spring数据规范的解决方案也可以。 编辑:使用15种不同的搜索标准,搜索标准可能会变得非常复杂。所以

  • 这个问题几乎说明了一切。使用JPARepository,我如何更新一个实体? JPARepository只有一个save方法,它并不告诉我它实际上是create还是update。例如,我向数据库用户插入一个简单的对象,它有三个字段:、和: 然后我只需调用,此时它实际上是对数据库的插入: 到目前为止还不错。现在我想更新这个用户,比如说改变他的年龄。为此,我可以使用查询,无论是QueryDSL还是Na

  • 我如何才能实现以下代码的等价: ...但是使用Spring和Spring-Data-JPA注释? 我现有代码的基础是: 但是我不知道如何指定方法中的所有内容都应该使用悲观锁集来完成。 有一个Spring Data JPA注释,它允许您设置,但我不知道将它放在方法上是否有效。这听起来更像是上的注释,因为Javadoc说: org.springframework.data.jpa.repository

  • 问题内容: 是否可以使用Spring Data JPA(由Hibernate作为JPA提供者支持)并同时直接使用Hibernate? 问题是,当我使用JpaTransactionManager时,无法使用检索当前会话。当我切换到HibernateTransaction Manager时,JPA存储库无法提交更改。 这是我的Spring上下文的一部分(在该上下文中,我无法使用直接的Hibernate

  • 我对Spring和冬眠是新的。我有一个使用Spring、Hibernate和PostgreSQL的项目。我知道我可以使用Spring Data JPA或Hibernate查询数据库,但我不知道每种方法的优点和缺点是什么。我还知道在后台,Spring Data JPA会调用Hibernate。那么我应该使用什么最佳方式来查询数据库以获得最佳性能,Spring数据JPA或Hibernate或取决于具体