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_id
identity
.
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)
Pouvez-vous s'il vous plaît poster la ligne ALTER TABLE, aussi? Celui qui provoque l'erreur? –