ManyToMany in dem Ruhezustand, ohne zusammengesetzten Schlüssel
-
06-09-2019 - |
Frage
ich mit Legacy-Datenbank zu tun habe. Und ich schreibe Unit-Test unter Verwendung von POJOs & Hibernate & HSQLDB . Und ich die folgende Fehlermeldung erhalten:
17:09:03,946 ERROR SchemaExport:349 - Attempt to define a second primary key in statement
Lassen Sie uns sagen, ich habe Post
und Tag
Entitäten (und natürlich ihre Tabellen posts
und tags
). Und es ist eine weitere Tabelle many-to-many zwischen Post
und Tag
genannt post_tags
zu definieren.
Da post_tags
einige zusätzliche Informationen über das Verhältnis enthält, wie active
und deleted
Spalten. Ich habe eine andere Entity PostTag
genannt, dies zu umgehen.
Zu meinem Problem hier zu beschreiben, sind die Pseudo-Klassen:
@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
}
Wenn ich die Anweisung suchen, die den Fehler erzeugt es Hibernate scheint versucht, einen Verbundschlüssel PRIMARY KEY (post_id, tag_id)
zu machen, und auch versucht, es post_id
identity
zu machen.
Kann jemand mir helfen, mein Problem zu beheben?
UPDATE:
Weil ich mit einer alten Datenbank zu tun habe war dies nur ein Beispiel, das Problem zu demonstrieren. Aber ich werde versuchen, die eigentliche Aussage zu übersetzen nach dem Beispiel (PS: Es ist nicht ALTER TABLE
es ist ein 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)
Lösung
Das Problem ist die @Id in der Klasse PostTag
: Erzählt wird Hibernate, dass Sie eine generierte Identität colum wollen. Zur gleichen Zeit, Sie sagen, „ich einen zusammengesetzten Schlüssel will“ mit der Abbildung des tags
Feldes in der Klasse Posts
.
Welche ein wünschen Sie? Hibernate kann nicht sagen.
Es ist ein sehr gutes Beispiel auf Seite 304 im Buch „Java Persistence mit Hibernate“. Es ist auf Google Bücher .
Wenn Sie nicht den zusammengesetzten Schlüssel wollen, dann müssen Sie die Verknüpfungstabelle als reale Objekte behandeln und PostTag
in der Klasse Posts
verwenden (das heißt Set<PostTag> postTags
statt Set<Tag> tags
)