Como reservar um conjunto de identificadores -chave primários para pré -carregar dados de bootstrap
Pergunta
Gostaríamos de reservar um conjunto de identificadores de chave primária para todas as tabelas (por exemplo, 1-1000) para que possamos inicializar o sistema com dados pré-carregados do sistema.
Todas as nossas classes de entidade JPA têm a seguinte definição para a chave primária.
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false, insertable = false, updatable = false)
private Integer id;
Existe uma maneira de dizer ao banco de dados que os incrementos devem começar a acontecer de 1000 (os dados específicos do cliente, ou seja, serão iniciados a partir de 1000). Nós apoiamos (h2, mysql, postgres
) em nosso ambiente e eu preferiria uma solução que possa ser acionada por meio de JPA e ferramentas DDL de engenharia reversa da Hibernate.
Deixe -me saber se esta é a abordagem correta
Solução
Você poderia tentar o TABLE
estratégia em vez de IDENTITY
. Do livro de hibernato:
Muito parecido com o hibernato
hilo
estratégia,TABLE
confia em uma tabela de banco de dados que contém o último valor de chave inteira gerada e cada gerador é mapeado para uma linha nesta tabela. Cada linha tem duas colunas:pkColumnName
evalueColumnName
. opkColumnValue
Atribui cada linha a um determinado gerador e a coluna Valor contém a última chave primária recuperada. O provedor de persistência aloca atéallocationSize
Inteiros em cada turno.
Aqui está um exemplo com mais explicação. E um mais complexo Exemplo para definir o valor inicial.
Você também pode tentar usar um gerador de sequência personalizado, definido em seu orm.xml
, assim:
<sequence-generator name="mySequenceGenerator"
sequence-name="MY_SEQUENCE"
initial-value="123"
allocation-size="20"/>
Isso declara que uma sequência de banco de dados nomeada
MY_SEQUENCE
Com um valor inicial de 123, pode ser usado como fonte para geração de identificador de banco de dados e que o mecanismo de persistência deve obter 20 valores sempre que precisar de identificadores. (Observe, porém, que as anotações de hibernação, no momento da redação, ignoram oinitialValue
contexto.)Para aplicar este gerador de identificador para uma entidade específica, use seu nome:
@Entity
class name MyEntity {
@Id @GeneratedValue(generator = "mySequenceGenerator")
String id;
}
Outras dicas
Se todo o resto falhar, você sempre pode escrever seu próprio gerador de identificação personalizado e usá -lo no seu DAO's create(Entity entity)
método. A tabela de sequência de identificação pode ser algo como
-------------------------------------------------------------
| sequence_name | initial_value | current_value | increment |
-------------------------------------------------------------
| foo | 1001 | 2000 | 100 |
Isso pode significar que os IDs para a tabela foo
Comece em 1001 e é incrementado em 100 (para que você não precise ligar para o DB para cada nova inserção de tabela).
É isso que estamos usando sem muitos problemas.