Como reservar um conjunto de identificadores -chave primários para pré -carregar dados de bootstrap

StackOverflow https://stackoverflow.com/questions/2606182

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

Foi útil?

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, TABLEconfia 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: pkColumnNamee valueColumnName. o pkColumnValue 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 o initialValue 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top