ManyToMany в Hibernate без составных ключей - PullRequest
1 голос
/ 27 мая 2009

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

1 Ответ

2 голосов
/ 27 мая 2009

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

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

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

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

...