1

我正在处理遗留数据库。我正在使用 pojos & hibernate & HSQLDB编写单元测试。我收到以下错误:

17:09:03,946 错误 SchemaExport:349 - 尝试在语句中定义第二个主键

假设我有PostTag实体(当然还有他们的表poststags)。Post还有另一个表来定义和Tag调用之间的多对多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它是a 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

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

你想要哪一个?Hibernate 无法判断。

在“Java Persistence with Hibernate”一书的第 304 页上有一个很好的例子。它在 Google 图书上

如果您不想要复合键,那么您必须将链接表视为真实对象并PostTag在类中使用Posts(即Set<PostTag> postTags代替Set<Tag> tags

于 2009-05-27T14:58:07.150 回答