ManyToMany在Hibernate中没有复合键

时间:2009-05-27 14:53:36

标签: hibernate hsqldb many-to-many composite-key

我正在处理遗留数据库。我正在使用pojos& amp;冬眠&的 HSQLDB 即可。我收到以下错误:

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

假设我有PostTag个实体(当然还有他们的表poststags)。还有另一个表格可以定义PostTag post_tags之间的多对多。

因为post_tags包含有关该关系的一些额外信息,例如activedeleted列。我创建了另一个名为PostTag的实体来处理这个问题。

在这里描述我的问题是伪类:

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

1 个答案:

答案 0 :(得分:2)

问题是类PostTag中的@Id:它告诉hibernate你想要一个生成的标识列。与此同时,您正在使用类tagsPosts字段的映射说“我想要一个复合键”。

你想要哪一个? Hibernate无法分辨。

“Java Persistence with Hibernate”一书的第304页有一个非常好的例子。 It's on Google books

如果您不想要复合键,则必须将链接表视为真实对象,并在类PostTag中使用Posts(即Set<PostTag> postTags而不是{{1} }})