@GenericGenerator 支持自定义 org.hibernate.id.IdentifierGenerator 实现。
Pooled-lo optimizer mapping using @GenericGenerator mapping
package org.example.demo.hibernate;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Persistence;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;
public class Test {
public static void main(String[] args) {
EntityManagerFactory factory = Persistence.createEntityManagerFactory("test");
EntityManager em = factory.createEntityManager();
Product p1 = new Product();
Product p2 = new Product();
Product p3 = new Product();
em.getTransaction().begin();
em.persist(p1);
em.persist(p2);
em.persist(p3);
em.getTransaction().commit();
em.close();
factory.close();
}
@Entity(name = "Product")
public static class Product {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "product_generator")
@GenericGenerator(name = "product_generator", strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", parameters = {
@Parameter(name = "sequence_name", value = "product_sequence"),
@Parameter(name = "initial_value", value = "1"), @Parameter(name = "increment_size", value = "3"),
@Parameter(name = "optimizer", value = "pooled-lo") })
private Long id;
}
}
生成 SQL
drop table if exists Product cascade
drop sequence if exists product_sequence
create sequence product_sequence start 1 increment 3
create table Product (id int8 not null, primary key (id))
select nextval ('product_sequence')
insert into Product (id) values (1)
insert into Product (id) values (2)
insert into Product (id) values (3)