2009-05-27 7 views
1

J'ai affaire à une base de données existante. Et j'écris le test unitaire en utilisant pojos & hibernate & HSQLDB. Et je reçois l'erreur suivante:ManyToMany dans Hibernate sans touches composées

17:09:03,946 ERROR SchemaExport:349 - Attempt to define a second primary key in statement

Disons que j'ai Post et Tag entités (et bien sûr leurs tables posts et tags). Et il y a une autre table pour définir plusieurs-à-plusieurs entre Post et Tag appelé post_tags.

Parce que post_tags contient des informations supplémentaires sur la relation, comme les colonnes active et deleted. J'ai créé une autre entité appelée PostTag pour gérer cela.

Pour décrire ici mon problème sont les classes pseudo:

@Entity 
@Table(name="post_tags") 
public class PostTag { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int id; 

    @ManyToOne 
    private Post post; 

    @ManyToOne 
    private Tag tag; 

    // setters and getters 
} 

@Entity 
@Table(name = "tags") 
public class Tag { 
    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private int id; 

    @ManyToMany(mappedBy = "tags",cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    private Set<Post> posts; 

    // setters and getters 
} 

@Entity 
@Table(name = "posts") 
public class Post { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 

    @ManyToMany 
    @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE}) 
    @JoinTable(name = "post_tags", joinColumns = { @JoinColumn(name = "post_id") }, inverseJoinColumns = { @JoinColumn(name = "tag_id") }) 
    private Set<Tag> tags; 

    // setters and getters 
} 

Quand je regarde la déclaration qui génère l'erreur il semble Hibernate essaie de faire une clé composite en utilisant PRIMARY KEY (post_id, tag_id), et aussi il essaie de faire post_ididentity.

Quelqu'un peut-il m'aider à résoudre mon problème?

MISE À JOUR:

Parce que je traite avec une base de données existante c'était juste un exemple pour illustrer le problème. Mais je vais essayer de traduire la déclaration réelle selon l'exemple (PS: Il est ALTER TABLE est un CREATE TABLE):

create table post_tags (id integer not null, post integer, tag integer, post_id integer generated by default as identity (start with 1), tag_id integer not null, primary key (post_id, tag_id) 
+0

Pouvez-vous s'il vous plaît poster la ligne ALTER TABLE, aussi? Celui qui provoque l'erreur? –

Répondre

2

Le problème est le @Id dans la classe PostTag: mise en veille prolongée Il dit que vous voulez une colonne d'identité générée. Dans le même temps, vous dites "Je veux une clé composite" avec le mappage du champ tags dans la classe Posts.

Lequel voulez-vous? Hibernate ne peut pas le dire.

Il existe un très bon exemple à la page 304 dans le livre "Java Persistence with Hibernate". It's on Google books.

Si vous ne voulez pas la clé composite, vous devez traiter la table de liens comme des objets réels et utiliser PostTag dans la classe Posts (c.-à-Set<PostTag> postTags au lieu de Set<Tag> tags)

+0

Eh bien, je ne veux pas de clé composite. Comment faire le mapping ManyToMany sans clé composite? – nimcap

Questions connexes