2009-05-27 112 views
1

我正在处理遗留数据库。我正在使用pojos编写单元测试& hibernate & HSQLDB。而且我收到以下错误:ManyToMany在休眠没有复合键

17:09:03,946 ERROR SchemaExport:349 - Attempt to define a second primary key in statement

比方说,我有PostTag实体(当然,他们的桌子poststags)。另外还有一张表,用于定义PostTag之间的多对多,称为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 
} 

当我看着生成似乎休眠正在努力使使用PRIMARY KEY (post_id, tag_id)复合键,并且还试图让错误的语句post_ididentity

任何人都可以帮助我解决我的问题吗?

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) 
+0

能否请您发布ALTER TABLE线,太?导致错误的那个? – 2009-05-27 14:55:49

回答

2

问题是@Id班上PostTag:告诉Hibernate要生成的标识列。同时,您要说tags字段Posts中的映射字段“我想要一个组合键”。

你想要哪一个?休眠不能告诉。

在“Java Persistence with Hibernate”一书的第304页有一个很好的例子。 It's on Google books

如果你不想复合键,那么你必须把链接表作为真正的对象和类Posts使用PostTag(即Set<PostTag> postTags代替Set<Tag> tags

+0

那么,我不想要一个复合键。如何在没有组合键的情况下执行ManyToMany映射? – nimcap 2009-05-27 15:02:48