2011-02-10 4 views
1

J'ai une question qui me dérange un peu.jpa Hibernate @ElementCollection

Lorsque j'utilise @ElementCollection dans mon entité, hibernate (3.5) me génère une table sans aucune contrainte.

Modifier Important

Mon entité est une sous-classe d'une autre classe. C'est peut-être la raison pour laquelle hibernate ne génère pas le pk et le fk.

Edit End

public MyEntity extends BaseEntity 
@ElementCollection(fetch=FetchType.EAGER) 
private Set<String> test; 

termine avec (postgres 9):

CREATE TABLE myentity_test 
(
    entityid bigint NOT NULL, 
    test character varying(255) 
) 

Est-ce que mon erreur en veille prolongée ne crée pas de contraintes comme les clés étrangères ou les index uniques? Je pourrais le configurer manuellement, mais je préférerais annoter l'entité correctement que hiberner complètement (autant que possible) crée ma base de données.

Meilleures salutations, m

PS: Mon mauvais à tout. Mélangé deux choses qui circulaient dans mon esprit. Je voulais dire @ElementCollection. PS: La @Column a contribué à fournir l'index unique. Modifier: corrigé les noms de mon exemple.

CREATE TABLE myentity_test 
(
    entityid bigint NOT NULL, 
    test character varying(255), 
    CONSTRAINT itemequipable_test_test_key UNIQUE (test) 
) 

J'attends quelque chose comme ça (code pseudo):

CREATE TABLE myentity_test 
(
    entityid bigint NOT NULL PRIMARY KEY, 
    test character varying(255) PRIMARY KEY, 
    CONSTRAINT fk_entityid references (myentity) on entityid 
) 
+1

Votre code d'exemple n'utilise pas @Enumerated –

+0

La clé étrangère est créée par une instruction séparée 'ALTER TABLE', vous l'avez peut-être manquée. – axtavt

+1

Cependant, je crois que vous avez juste besoin d'une annotation @Column que vous pouvez définir nullable = false etc. si vous le souhaitez. –

Répondre

1

@Column et @ JoinColum/@ OneToMany annotations sont la bonne façon de gérer les clés étrangères et des contraintes uniques, même avec la @ElementCollection.

Dans votre exemple particulier, il n'y aura pas de relation de clé étrangère car String (le type de votre ensemble) n'est pas mappé à une autre entité.

+0

Bon endroit. Oui. Lorsque le type (xxx) n'est pas évident, vous aurez besoin de (..., targetEntity = xxx). Bien qu'une entité équivalente à String soit difficile à imaginer. –

+0

Avec la clé étrangère, je voulais dire que de la table de collection, il devrait y avoir une clé étrangère dans l'entityid et une clé primaire dans entityid et test. – mkuff

+0

J'ai découvert que lorsque je change ma stratégie d'héritage en single_table, la table de collection sera générée correctement. Peut-être qu'il y a un problème avec hbm2ddl. fonctionne bien maintenant.merci beaucoup pour tous les assistants! – mkuff