1

私はレガシーデータベースを扱っています。そして、 pojos & hibernate & HSQLDBを使用して単体テストを書いています。そして、次のエラーが表示されます。

17:09:03,946 エラー SchemaExport:349 - ステートメントで 2 番目の主キーを定義しようとしています

私がPostTagエンティティ (そしてもちろんそれらのテーブルpoststags) を持っているとしましょう。Postまた、 と の間で多対多を定義する別のテーブルがTag呼び出されpost_tagsます。

列などのpost_tags関係に関する追加情報が含まれているためです。これを処理するために呼び出される別のエンティティを作成しました。activedeletedPostTag

ここで私の問題を説明するために、疑似クラスがあります:

@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
}

エラーを生成するステートメントを見ると、Hibernate が を使用して複合キーを作成しようとしているように見えPRIMARY KEY (post_id, tag_id)ますpost_id identity

誰でも私の問題を解決するのを手伝ってもらえますか?

アップデート:

私は従来のデータベースを扱っているため、これは問題を示すための単なる例です。しかし、例に従って実際のステートメントを翻訳しようとします(PS:それはそうALTER TABLEではありません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)
4

1 に答える 1

2

問題は、クラスの @IdPostTagです。生成された ID 列が必要であることを hibernate に伝えます。同時に、tagsクラス内のフィールドのマッピングで「複合キーが欲しい」と言っていますPosts

あなたはどれが欲しいですか?ハイバネートはわかりません。

本「Java Persistence with Hibernate」の 304 ページに非常に良い例があります。Google ブックスにあります。

複合キーが必要ない場合は、リンク テーブルを実際のオブジェクトとして扱い、PostTagクラスで使用する必要がありますPosts(つまり、 のSet<PostTag> postTags代わりにSet<Tag> tags)

于 2009-05-27T14:58:07.150 に答える