0

ORMプロバイダーとしてEclipseLinkでJPA 2.0を使用しています。データベースはオラクル11gです。

このデータ モデルには、以下に示すように、一方向の @OneToMany 関係によってマッピングされた 2 つのエンティティがあります。

@Entity
@Table(name = "v_page")
public class Page {

    @Id
    @GeneratedValue(generator = "g_page")
    @SequenceGenerator(name = "g_page", sequenceName = "sq_page")
    private long id;

    @Column(name = "navigation_id")
    private String navigationId;

    @Column
    private String title;

    @OneToMany(cascade = ALL, fetch = EAGER)
    @JoinColumn(name = "page_id")
    @OrderColumn(name = "position")
    private List<Section> sections = new ArrayList<>();
}

そして 2 番目のエンティティ、セクション:

@Entity
@Table(name = "v_section")
public class Section {

    @Id
    @GeneratedValue(generator = "g_section")
    @SequenceGenerator(name = "g_section", sequenceName = "sq_section")
    private long id;

    @Column
    private String title;

    @Column
    @Lob
    private String content;
}

セクションを含むページを作成してデータベースに挿入しても問題ありません。唯一の問題は、EclipseLink がセクション挿入ごとに 2 つの SQL ステートメントを生成していることです。

INSERT INTO v_page (ID, navigation_id, TITLE, manual_id) VALUES (?, ?, ?, ?)
INSERT INTO v_section (ID, CONTENT, TITLE) VALUES (?, ?, ?)
INSERT INTO v_section (ID, CONTENT, TITLE) VALUES (?, ?, ?)
UPDATE v_section SET position = ?, page_id = ? WHERE (ID = ?)
UPDATE v_section SET position = ?, page_id = ? WHERE (ID = ?)

これにより、列 page_id と position に not null 制約を設定できなくなります。

所有エンティティ ページがこの時点で既に作成されているため、EclipseLink が挿入と更新を単一の挿入に結合できない理由がわかりません。EclipseLink で単一の挿入のみを生成するためにできることはありますか?

4

0 に答える 0