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 に答える