2010-05-12 6 views
11

J'essaie d'implémenter certaines entités de base en utilisant Hibernate/JPA. Initialement, le code était déployé sur MySQL et fonctionnait correctement. Maintenant, je le transfère pour utiliser PostgreSQL. En MySQL, ma classe d'entité définit sa clé primaire comme une valeur à long auto-incrémentée avec la syntaxe suivante:Hibernate/JPA et PostgreSQL - Clé primaire?

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

Cependant, j'ai trouvé que je reçois des erreurs avec PostgreSQL lorsque je tente et insérer de nombreux dossiers à un temps. De quoi ai-je besoin pour annoter ma clé primaire afin d'obtenir le même comportement d'auto-incrémentation dans PostgreSQL qu'avec MySQL? Merci pour toute l'aide que vous pourrez fournir!

+1

GenerationType.AUTO ne devrait pas causer de problème avec les bases de données. Pouvez-vous publier l'exception et/ou votre code d'insertion? Il est à noter que sur MySQL, GenerationType.AUTO est converti en type d'incrément alors que sur PostgreSQL, il utilise la séquence par défaut. Voir le doc ici http://docs.jboss.org/hibernate/core/3.5/reference/fr/html/mapping.html#mapping-declaration-id pour une description – ig0774

+0

Je vais essayer une fois de plus et ensuite poster le exception que je reçois. La façon dont mes classes d'entités sont configurées est d'avoir une classe de base abstraite avec l'id défini et l'annotation @MappedSuperclass dessus, puis de dériver le reste de mes entités à partir de là. Pensez-vous que cela va créer un problème avec PostgreSQL? – Shadowman

+0

Insérez-vous avec JPA 'persist()' et 'merge()' ou directement SQL? 'GenerationType.AUTO' signifie que" le fournisseur de persistance doit choisir une stratégie appropriée "(JPA 2.0 Final Release, Section 11.1.17). Cela n'implique pas nécessairement une relation de séquence. Seul 'GenerationType.SEQUENCE' force le fournisseur JPA à utiliser une séquence. La question est actuellement trop vague pour être sûr, mais peut-être Hibernate a-t-il décidé de générer 'id' avec une table sous Postgres et peut-être que vous utilisez SQL en attendant une valeur de séquence par défaut inexistante pour la colonne' id'. S'il vous plaît montrer les relations Postgres (psql's \ d'). –

Répondre

10

J'ai résolu le problème. Auparavant - dans ma mise en œuvre MySQL - je servais d'une classe de base abstraite avec la signature suivante:

@MappedSuperclass 
public abstract class AbstractDomainEntity implements Serializable { 

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

     ... 
} 

... puis j'ai étendu ce dans chacune de mes entités restantes. J'ai depuis poussé cet attribut dans les entités elles-mêmes, et j'ai configuré le @GenerationType comme SEQUENCE. Par exemple:

public class UserProfileBean extends AbstractIdentifiedDomainEntitiy { 

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

     ... 
} 

Ce faisant, les séquences correctes sont générées et utilisées au sein de Hibernate/JPA et PostgreSQL. Avant, même si je déclarais GenerationType en tant que séquence, aucun n'était en cours de création. Merci pour votre aide et vos conseils dans ce domaine!

+0

Il est parfois nécessaire d'échapper les noms et de mettre des guillemets comme: name = "\" profile_seq \ "" –

17

GenerationType.IDENTITY

+0

C'est l'astuce! Merci. –

+0

Quelle légende! Cela a fonctionné pour moi sur mon @MappedSuperclass :) –

+0

Beaucoup mieux que le accepté. Bien que cela fonctionne probablement, cela ne nécessite aucune définition de générateur personnalisé. Merci! – nerdwaller