Вопрос

Я имею дело с устаревшей базой данных.И я пишу модульный тест, используя 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.

Может ли кто-нибудь помочь мне решить мою проблему?

ОБНОВЛЯТЬ:

Поскольку я имею дело с устаревшей базой данных, это был всего лишь пример, демонстрирующий проблему.Но я попробую перевести собственно высказывание по примеру (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)
Это было полезно?

Решение

Проблема в @Id в классе PostTag:Он сообщает спящему режиму, что вам нужен сгенерированный столбец идентификаторов.В то же время вы говорите: «Мне нужен составной ключ» с отображением tags поле в классе Posts.

Какой вы хотите?Спящий режим не может сказать.

На странице 304 книги «Сохранение Java в Hibernate» есть очень хороший пример. Это в книгах Google.

Если вам не нужен составной ключ, вы должны относиться к таблице ссылок как к реальным объектам и использовать PostTag в классе Posts (т.е. Set<PostTag> postTags вместо Set<Tag> tags)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top