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

19-02-10 banq
         

在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算法在一次数据库往返中获取多个标识符:

源代码可以在这里找到  。