Я имею дело с устаревшей базой данных. И я пишу модульный тест, используя pojos & hibernate & HSQLDB . И я получаю следующую ошибку:
17:09:03,946 ERROR SchemaExport:349 - Attempt to define a second primary key in statement
Допустим, у меня есть 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
.
Может кто-нибудь помочь мне решить мою проблему?
UPDATE:
Поскольку я имею дело с устаревшей базой данных, это был только пример, чтобы продемонстрировать проблему. Но я постараюсь перевести фактическое утверждение в соответствии с примером (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)