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

大容量插入现有数据:防止JPA在每次插入之前进行选择

谷出野
2023-03-14

然而,当我打开Hibernate的查询日志记录时,我看到在每个insert查询之前,都会执行一个select查询,以查看具有该id的实体是否已经存在。这是因为实体已经有了我提供的id。

我理解这种行为,这实际上是有道理的。但是,我确信ID将不存在,所以选择对我的情况没有意义。我保存了数以千计的记录,这意味着在大型表上有数以千计的select查询,这大大减缓了导入过程。

我的问题是:有没有办法关闭这个“在插入之前检查实体是否存在”?

@Id
@GeneratedValue(generator = "use-id-or-generate")
@GenericGenerator(name = "use-id-or-generate", strategy = "be.stackoverflowexample.core.domain.UseIdOrGenerate")
@JsonIgnore
private String id;
public class UseIdOrGenerate extends UUIDGenerator {

  private String entityName;

  @Override
  public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException {
      entityName = params.getProperty(ENTITY_NAME);
      super.configure(type, params, serviceRegistry);
  }

  @Override
  public Serializable generate(SessionImplementor session, Object object) 
  {
        Serializable id = session
            .getEntityPersister(entityName, object)
            .getIdentifier(object, session);

      if (id == null) {
        return super.generate(session, object);
      } else {
        return id;
      }
  }
}

共有1个答案

邢博文
2023-03-14

如果您确信永远不会更新数据库中的任何现有条目,并且所有实体都应该始终是新插入的,那么我会选择persist操作,而不是merge

每次更新

在这种情况下(id字段设置为自动生成),唯一的方法是从id字段中删除生成注释,并将配置保留为:

@Id
@JsonIgnore
private String id;
 类似资料:
  • 就像有人说的第二种方式更慢,但我不确定,那么哪种方式更好呢?不能使数据库崩溃。

  • 问题内容: 我正在寻找一些防止SQL注入的技巧。在一个论坛上告诉我我的代码不安全,我正在寻找一个足够好的人来帮助我解决此问题。 我有一个Web表单,提交后转到aspx.cs页,然后将数据插入ms sql数据库。 问题答案: 最直接的解决方法是 不 通过将字符串串联在一起来构建sql,而是使用params。如果您使用的是SqlCommand,则可以执行以下操作,否则按照@MarcB的建议进行操作

  • 当我从CSV文件向表插入大容量数据时,它不工作,显示错误: 行2列9的大容量加载数据转换错误(类型不匹配或指定代码格式的字符无效) csv文件中的第9列值为NULL。 我怎么处理这个?

  • root-context.xml文件是: servlet-context.xml文件是: 我的@Entity类是: 控制台输出为:

  • 我正在为SQL Server使用大容量插入命令,但由于某些原因,第一行没有插入。为什么不能从第一行插入数据?大容量插入是否需要标头作为默认设置,如何规避?如果我添加一个虚拟行,并将设置为,那么插入第一行就没有问题了,但我认为这不是一个好的解决方案。 示例数据:

  • 问题内容: 有没有一种方法可以使用JPA EntityManager使用批处理插入。我知道没有直接方法可以实现这一目标,但是必须有某种方法可以实现这一机制。 实际上,对于每一次插入操作,我要花300毫秒,我想减少使用批量插入而不是单次插入的时间。 这是我目前正在执行的用于单次插入的代码 提前致谢。 问题答案: 它 是 可以进行使用JPA成批写操作,但它是高度依赖于具体的实现你的持久性提供数据库和J