2010-05-12 21 views
11

Estoy tratando de implementar algunas entidades básicas usando Hibernate/JPA. Inicialmente, el código se implementó en MySQL y funcionaba bien. Ahora, lo estoy transfiriendo para usar PostgreSQL. En MySQL, mi clase de entidad define su clave primaria como un valor a largo incremento automático con la siguiente sintaxis:Hibernate/JPA y PostgreSQL: ¿clave principal?

@Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

Sin embargo, he descubierto que tengo errores con PostgreSQL cuando trato y de colocar varios registros en una hora. ¿Con qué debo anotar mi clave principal para obtener el mismo comportamiento de incremento automático en PostgreSQL que con MySQL? ¡Gracias por cualquier ayuda que usted nos pueda proporcionar!

+1

GenerationType.AUTO no debería causar un problema con ninguna base de datos. ¿Puedes publicar la excepción y/o tu código de inserción? Vale la pena señalar que en MySQL, GenerationType.AUTO se convierte en el tipo de incremento, mientras que en PostgreSQL, utiliza la secuencia de forma predeterminada. Consulte el documento aquí http://docs.jboss.org/hibernate/core/3.5/reference/en/html/mapping.html#mapping-declaration-id para obtener una descripción – ig0774

+0

Lo intentaré una vez más y luego publicaré el excepción que estoy recibiendo. La forma en que tengo configurada mi clase de entidad es tener una clase base abstracta con la identificación definida y la anotación @MappedSuperclass en ella, y luego derivar el resto de mis entidades desde allí. ¿Crees que eso creará un problema en PostgreSQL? – Shadowman

+0

¿Está insertando con JPA 'persist()' y 'merge()' o SQL directo? 'GenerationType.AUTO' significa que" el proveedor de persistencia debe elegir una estrategia adecuada "(Versión final de JPA 2.0, Sección 11.1.17). No implica necesariamente una relación de secuencia. Solo 'GenerationType.SEQUENCE' obliga al proveedor de JPA a usar una secuencia. La pregunta es actualmente demasiado vaga para estar seguro, pero tal vez Hibernate decidió generar 'id' con una tabla en Postgres y quizás esté ejecutando SQL esperando un valor de secuencia predeterminado inexistente para la columna' id'. Por favor, muestre las relaciones de Postgres (psql's '\ d'). –

Respuesta

10

He resuelto el problema. Anteriormente - en mi aplicación MySQL - Hice uso de una clase base abstracta con la siguiente firma:

@MappedSuperclass 
public abstract class AbstractDomainEntity implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id = null; 

     ... 
} 

... y luego me ampliado esto en cada una de mis entidades restantes. Desde entonces he empujado este atributo hacia las propias entidades, y configuré @GenerationType como SEQUENCE. Por ejemplo:

public class UserProfileBean extends AbstractIdentifiedDomainEntitiy { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "profile_seq") 
    @SequenceGenerator(name = "profile_seq", sequenceName = "profile_seq") 
    private Long id = null; 

     ... 
} 

Al hacerlo, las secuencias adecuadas están siendo generados y utilizados dentro de Hibernate/JPA y PostgreSQL. Antes, incluso si declaraba el GenerationType como Sequence, no se creaba ninguno. ¡Gracias por toda su ayuda y consejo en este asunto!

+0

A veces es necesario para escapar de los nombres y poner citas como: name = "\" profile_seq \ "" –

17

GenerationType.IDENTITY

+0

¡Ese es el truco! Gracias. –

+0

¡Qué leyenda! Esto funcionó para mí en mi @MappedSuperclass :) –

+0

Mucho mejor que el aceptado. Si bien es probable que funcione, esto no requiere definiciones de generador personalizado. ¡Gracias! – nerdwaller

Cuestiones relacionadas