2013-03-02 108 views
0

我在JPA单个表继承层次结构,如下所示子类不能坚持在超类中定义的关系:JPA /休眠单表继承 -

@Entity 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
@Table(catalog = "onedb", name = "content") 
@DiscriminatorColumn(name = "oid_content_type", discriminatorType = DiscriminatorType.INTEGER) 
public abstract class Content implements Serializable { 
    ... 
    @OneToMany(cascade = CascadeType.PERSIST) 
    @JoinColumn(name = "oid_content", referencedColumnName = "oid_content") 
    private List<ContentKeyword> keywords; 
    ... 

@Entity 
public abstract class RichMedia extends Content { 
    ... 
    @OneToMany(mappedBy="richMedia", cascade =CascadeType.PERSIST) 
    private Set<RichMediaFile> richMediaFiles; 
... 

} 

@Entity 
@DiscriminatorValue("1") 
public class RichMediaImage extends RichMedia {} 

如可以看到的内容是最上面的基类,富媒体广告是RichMediaImage基类和内容具有定义如下ContentKeyword列表:

@Entity 
@Table(catalog = "onedb", name="content_keyword") 
public class ContentKeyword implements Serializable { 
    ... 
    @ManyToOne 
    @JoinColumn(name = "oid_content") 
    private Content content; 
} 

我构建一个RichMediaImage并设置ContentKeyword它的列表,并尝试将持续整个对象。 的单个表,内容被插入与一个新行,并产生新的ID,但是当涉及到插入到未在SQL JPA提供此新ID的content_keyword表生成:

insert into onedb.content_keyword (oid_content, keyword) values (NULL, 'test') 

投掷

MySQLIntegrityConstraintViolationException: Column 'oid_content' cannot be null 

我非常感谢任何指针。

回答

1

您的映射不正确。在双向一对多关联时,一方必须是多侧面的逆侧:

@OneToMany(mappedBy = "content", cascade = CascadeType.PERSIST) 
private List<ContentKeyword> keywords; 

而且,当涉及到assicoation JPA只考虑了业主方。因此,向内容添加关键字是不够的。您还必须设置关键字的内容:

content.getKeywords().add(keyword); 
keyword.setContent(content); 
+0

非常感谢您的快速响应,但我仍然得到确切的错误; oid_content不能为空。 – Cuneyt 2013-03-02 22:29:25

+0

感谢Nizet,我在修复欢呼声中遇到了一个错误。非常感谢你的帮助 – Cuneyt 2013-03-02 22:42:08