0

我在 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 {}

可以看出 Content 是最顶层的基类,RichMedia 是 RichMediaImage 的基类,Content 有一个 ContentKeyword 列表,定义如下:

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

我构造了一个 RichMediaImage 并在其上设置了 ContentKeyword 列表并尝试保留整个对象。单个表,内容插入新行并生成新 id,但是当插入到 content_keyword 表中时,该新 id 未在 sql jpa 生成中提供:

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

投掷

MySQLIntegrityConstraintViolationException: Column 'oid_content' cannot be null

我将不胜感激任何指针。

4

1 回答 1

1

您的映射不正确。在双向 OneToMany 关联中,一侧必须是多侧的反面:

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

而 JPA 在关联方面只考虑所有者方面。因此,向内容添加关键字是不够的。您还必须在关键字中设置内容:

content.getKeywords().add(keyword);
keyword.setContent(content);
于 2013-03-02T21:37:48.613 回答