以下に示すように、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
ポインタをいただければ幸いです。