我正在处理遗留数据库。我正在使用 pojos & hibernate & HSQLDB编写单元测试。我收到以下错误:
17:09:03,946 错误 SchemaExport:349 - 尝试在语句中定义第二个主键
假设我有Post
和Tag
实体(当然还有他们的表posts
和tags
)。Post
还有另一个表来定义和Tag
调用之间的多对多post_tags
。
因为post_tags
包含一些关于关系的额外信息,比如active
和deleted
列。我创建了另一个实体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)