Pregunta

He configurado Hibernate utilizar secuencia PostgreSQL (a través de las anotaciones) para generar valores de clave principal id columna como sigue:

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
@Column(name="id", unique=true, nullable=false)
public int getId() {
    return this.id;
}

Lo que veo con esta configuración es que hibernación ya es asignar ID Valores> 3000 persistiendo, mientras que la consulta en usados ??secuencia muestra lo siguiente:

database=# select last_value from entity_id_seq;
last_value 
------------
     69

(1 fila)

Las preguntas:
¿Hay algo malo o no?
Deben hibernar sincronía con la tabla de secuencia?
Si no es así, ¿de dónde almacenar el último identificador generado?

Gracias.

¿Fue útil?

Solución

Yo tenía el mismo problema. Se relaciona con el ID de asignación de las estrategias de hibernación. Si desea pedir que elija n GenerationType.SEQUENCE , Hibernate utiliza la estrategia NiHo que asigna los ID de los bloques de 50 por defecto. Por lo tanto se puede establecer de forma explícita allocationSize valor de la siguiente manera:

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
@Column(name="id", unique=true, nullable=false)
public int getId() {
    return this.id;
}

Sin embargo, también he escuchado opiniones que el uso de la estrategia de Hilo con un allocationSize = 1 no es una práctica buena. Algunas personas recomiendan usar GenerationType.AUTO en lugar cuando se tiene que hacer frente a las secuencias de bases de datos gestionados

Actualización: que terminó yendo con allocationSize = 1, y las cosas parecen funcionar como espero ahora. Mi solicitud es tal que realmente no necesito bloques de identificadores de todos modos, así YMMV .

Otros consejos

No utilice GenerationType.SEQUENCE para las secuencias de Postgres!

Es completamente contrario a la intuición, pero la gente de Hibernate completamente en mal estado en esto. Usted debe utilizar GenerationType.AUTO o Hibernate demoler sus secuencias si tiene que reiniciar / reconstruir su base de datos. Es casi negligencia criminal que permitirían este código para entrar en una acumulación de producción, pero el equipo de Hibernate es bastante famosa por sus posturas con cabeza de toro hacia posiciones de plano-equivocadas (echa un vistazo a su posición sobre IZQUIERDA combinaciones, por ejemplo).

En primer lugar, hay que determinar qué versión de Hibernate que está utilizando. En términos de versiones de hibernación-núcleo, 3,2 introdujeron en adelante soporte más consistente para los generadores de id especialmente en lo que respecta a se define en las anotaciones. Ver http://in.relation.to/Bloggers/New323HibernateIdentifierGenerators para una discusión.

A continuación 3.6 introdujo un ajuste ( 'hibernate.id.new_generator_mappings') que hace que los generadores discutidos en ese blog la forma predeterminada de la APP-anotaciones se manejan. El entorno es falsa por defecto porque Hibernate tiene que mantener la compatibilidad hacia atrás con versiones anteriores. Si desea que el nuevo comportamiento (que está completamente recomendado) a continuación, establecer simplemente que establece el valor true.

¿Cómo se maneja GenerationType depende de la versión que está utilizando y tanto si ha definido '' hibernate.id.new_generator_mappings true. Voy a suponer que está utilizando 3.6+ (ya que nada más vieja es, así, de edad) y tenemos conjunto '' hibernate.id.new_generator_mappings true (ya que esa es la recomendación para nuevas aplicaciones):

  1. GenerationType.AUTO -> tratado como GenerationType.SEQUENCE
  2. GenerationType.SEQUENCE -> se asigna a la clase org.hibernate.id.enhanced.SequenceStyleGenerator discutido en el blog
  3. GenerationType.TABLE -> se asigna a la clase org.hibernate.id.enhanced.TableGenerator discutido en el blog

En Postgres Me gustaría hacer esto:

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="\"entity_id_seq\"")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="\"pk_sequence\"")
@Column(name="\"id\"", unique=true)
private int id;

en su mayoría con nombres en mayúsculas Hibernate necesidad de ser aprobado cotizaciones escapado a fin de comprender Postgres y encontrar las tablas, columnas o nombres de secuencias.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top