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)
War es hilfreich?

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)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top