使用MySQL和数据库生成的ID进行JPA/Hibernate批量插入/批量插入

3

好的,我搜索了很久,似乎找不到一种好的方法来使用JPA/Hibernate和MySQL进行批量插入。

我希望能够使用JPA一次性保存/插入多个记录,但是如果您使用GenerationType.IDENTITY,则默认情况下禁用了批处理行为。我知道您可以切换到GenerationType.SEQUENCE,但是这在MySQL上不可用,并且在我的场景中创建新表并使用GenerationType.TABLE也不是一个选项。

因此,最终,我需要一种使用JPA/Hibernate、MySQL和数据库生成的ID进行批量/大量插入的高效方法。我知道这样做是有效的,因为我可以使用JDBC连接来完成,但是我真的不想为每个存储库编写自己的JDBC查询。

有人知道如何实现这一点吗?

如果无法获取具有ID的更新实体(例如List<User> saveAll()),那么我可以接受void saveAll()。我的主要要求是这在一个/两个大查询中发生,而不是像现在调用saveAll时逐个实体保存。


如果需要更多信息,我可以提供以下实体:

@Entity
@Builder
@Getter
@Setter
@With
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = false, exclude = "id")
@Table(name = "user")
@ToString(callSuper = true, onlyExplicitlyIncluded = true)
public class User {

    @Id
    @ToString.Include
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "uID")
    private long id;

    private String name;
}
2个回答

0

使用Hibernate时,如果使用标识生成策略,则无法通过JDBC批处理实现插入操作,因为对于Hibernate来说,在持久化/插入之后,每个实体必须分配一个PK值。

但是,您可以使用Hibernate SPI自己实现此功能。请查看Hibernate如何在此处实现插入org.hibernate.persister.entity.AbstractEntityPersister#insert(java.lang.Object, java.lang.Object[], java.lang.Object, org.hibernate.engine.spi.SharedSessionContractImplementor)。如果您只想为一些已知的仅使用少量功能的实体实现此功能,则可以降低复杂性。


0

IDENTITY生成器禁用了Hibernate和JPA的JDBC批量插入。由于MySQL不支持序列,因此无法使用MySQL和Spring Data JPA批量插入记录。请阅读我的博客。这并不是终点。我们可以使用JDBC模板或查询DSL-SQL。要查看如何使用查询DSL-SQL实现,请单击此处。要使用JDBC模板,请单击此处

如果您需要类型安全、易于编码的选择,请选择查询DSL-SQL,否则请选择JDBC模板。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接