2

HibernateとJPAで親子クラスを作成しました。クラスを永続化しようとすると、「無効な列インデックス」というSQL例外が発生します。

これは親クラスです:

@Entity
@Table(name = "vnd_base_file_format")
public class VendorBaseFileFormat implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "base_file_format_id")
    private int baseFileFormatId;

    @Column(name = "vendor_id")
    private int vendorId;

    @Column(name = "format_name")
    private String formatName;

    @Column(name = "enabled")
    private boolean enabled;

    @Column(name = "month_year_format")
    private String monthYearFormat;

    @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    @JoinColumn(name="base_file_format_id", nullable=false)
    @OrderBy("index")
    private List<VendorBaseFileDimension> dimensions;

これは子クラスです:

@Entity
@Table(name = "vnd_base_file_format_dim")
public class VendorBaseFileDimension implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "dimension_id")
    private int dimensionId;

    @Column(name = "alternate_name")
    private String alternateName;

    @Column(name = "dimension_index")
    private int index;

    @Id
    @ManyToOne
    @JoinColumn(name="base_file_format_id", nullable=false, insertable=false)
    private VendorBaseFileFormat format;

親クラスを作成し、それに1つの子クラスを追加するだけです。entityManager.persistを呼び出すと、次のメッセージが表示されます。

Hibernate: insert into vnd_base_file_format (enabled, format_name, month_year_format, vendor_id, base_file_format_id) values (?, ?, ?, ?, ?)
Hibernate: insert into vnd_base_file_format_dim (alternate_name, dimension_index, base_file_format_id, dimension_id) values (?, ?, ?, ?)
[21:53:01.159] WARN  JDBCExceptionReporter - SQL Error: 17003, SQLState: 99999
[21:53:01.159] ERROR JDBCExceptionReporter - Invalid column index

どんな助けでもいただければ幸いです。挿入可能をfalseに設定するなど、いくつか試しましたが、うまくいきませんでした。複合キーに問題がある可能性があるという質問が1つありました。親の一部としてのみ存在する場合、子に一意のシーケンス列を作成する必要がありますか?

4

3 に答える 3

1

役立つ解決策について別の質問を見つけました。個々のID列を複合キーオブジェクトに変更しましたが、これはうまくいったようです。

私が必要とした主な情報は、この記事のここにあります。

私がそれを理解するのを助けた質問はここに投稿されました。

于 2012-08-04T02:29:54.933 に答える
0

orderByアノテーションのフィールド名が「インデックス」であることがわかります。他のクラスのインデックスに1つのゲッターを提供するか、「dimension_index」に変更してみてください。うまくいけば、それは問題を解決するはずです。

于 2012-08-03T02:10:27.150 に答える
0

関係を保持するためにリストコレクションを使用しているため、インデックス列の問題が発生すると思います。あなたはそのようなことをすることができます:

1)VendorBaseFileFormatクラスでリストをSetに変更します。

2)@IndexColumn(name = "idx")アノテーションをクラスに追加し、リストインデックスの保持に使用されるこの列で明示的に指定します。この列も*vnd_base_file_format_dim*テーブルに追加する必要があります。このチュートリアルには、リストを使用した双方向の1対多マッピングの例があります(セクション8)。

于 2012-08-03T08:52:09.320 に答える