EclipseLink不包含ManyToMany关系的生成选项

时间:2014-09-10 17:44:31

标签: java sql postgresql jpa eclipselink

我在 EclipseLink / JPA (2.5.2), Postgresql 方面遇到了一些问题(9.3)和 模式生成 。对于我的Spring应用程序,我很乐意在两个类之间创建 @ManyToMany 关系,但是它拒绝创建第二个中间表,它提供了两个级联选项< / em>的

我的两个类都有 hashCode() equals(...)的正确实现,两者都涉及其他关系, 非@ManyToMany 当然,支持 CASCADE 选项并且运行正常。

[Stream]-(0..n)--<streams_tags>--(0..n)-[Tag]

以下是关于ManyToMany关系的DDL脚本的片段:

CREATE TABLE streams_tags (tagged_streams INTEGER NOT NULL, tags INTEGER NOT NULL, PRIMARY KEY (tagged_streams, tags))
...
ALTER TABLE streams_tags ADD CONSTRAINT UNQ_streams_tags_0 UNIQUE (tags, tagged_streams)
...
ALTER TABLE streams_tags ADD CONSTRAINT FK_streams_tags_tagged_streams FOREIGN KEY (tagged_streams) REFERENCES TAGS (TID)
...
ALTER TABLE streams_tags ADD CONSTRAINT FK_streams_tags_tags FOREIGN KEY (tags) REFERENCES STREAMS (SID)

以下存根直接从相关类中提取, Stream Tag

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = Stream.TAGS_JOIN_TABLE, 
            joinColumns = @JoinColumn(name = Stream.TAGS_JOIN_COLUMN), 
            inverseJoinColumns = @JoinColumn(name = Tag.TAGGED_STREAMS_JOIN_COLUMN), 
            uniqueConstraints = @UniqueConstraint(columnNames = {
        Stream.TAGS_JOIN_COLUMN, Tag.TAGGED_STREAMS_JOIN_COLUMN }))
@CascadeOnDelete
List<Tag> tags;

以下是标记类,它不直接保存关系。

@ManyToMany(mappedBy = "tags")  
List<Stream> streams;

这是我在尝试删除带标记的 时收到的可预测错误:

ERROR: update or delete on table "streams" violates foreign key constraint "fk_streams_tags_tags" on table "streams_tags"
  Dettaglio: Key (sid)=(2) is still referenced from table "streams_tags".

提前感谢您,任何帮助将不胜感激! :)

1 个答案:

答案 0 :(得分:0)

您正在使用@CascadeOnDelete告诉EclipseLink数据库将处理删除streams_tags引用,如下所述:http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_cascadeondelete.htm

删除此批注,以便EclipseLink将从连接表中删除,或更改DDL以便包含ON DELETE CASCADE,或者让EclipseLink为您http://wiki.eclipse.org/EclipseLink/Examples/JPA/DDL生成DDL或使用{{3}生成JPA }