Hibernate/JPA批插入中使用PostgreSQL的(BIG)SERIAL自增主键


在PostgreSQL中使用GenerationType.IDENTITY会失效批处理能力。因此使用其(BIG)SERIAL,它的作用类似MySQL的 AUTO_INCREMENT。

这里使用GenerationType.SEQUENCE激活批插入处理,通过hi/lo算法优化它。

第一步,使用GenerationType.SEQUENCE替代GenerationType.IDENTITY:


@Entity
public class TennisPlayer implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    // This will disable insert batching - AVOID IT! 会失效批处理
   
// @GeneratedValue(strategy = GenerationType.IDENTITY)
    
   
// This will work, but better use the below solution 性能不佳
   
// @GeneratedValue(strategy = GenerationType.AUTO)

   
// This will allow insert batching and optimizes the identifiers
   
// generation via the hi/lo algorithm
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator =
"hilo")
    @GenericGenerator(name =
"hilo"
            strategy =
"org.hibernate.id.enhanced.SequenceStyleGenerator",
            parameters = {
                @Parameter(name =
"sequence_name", value = "sequence"),
                @Parameter(name =
"initial_value", value = "1"),
                @Parameter(name =
"increment_size", value = "10"),
                @Parameter(name =
"optimizer", value = "hilo")
            })
    private Long id;

这里依靠hi/lo算法在一次数据库往返中获取多个标识符:

源代码可以在这里找到  。