1

現在、Netbeans プロジェクトを Glassfish サーバーにデプロイするときに BUILD FAILED エラーの問題が発生しています。ログから次のエラーが表示されます。

例外の説明: エンティティ クラス [class entity.InstrumentExtRef] の注釈付き要素 [field instrument] の @JoinColumns が不完全です。ソース エンティティ クラスが複合主キーを使用する場合、@JoinColumns を使用して結合列ごとに @JoinColumn を指定する必要があります。name 要素と referencedColumnName 要素の両方を、そのような @JoinColumn ごとに指定する必要があります。詳細については、server.log を参照してください。

問題が発生しているテーブルは、instrument_ext_ref であり、instrument_id および instrument_code_type フィールドの複合主キーがあります。

問題があると思われるエンティティ クラス - InstrumentExtRef - には、次の宣言と注釈があります。

@EmbeddedId
protected InstrumentExtRefPK instrumentExtRefPK;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 16)
@Column(name = "reference")
private String reference;
@JoinColumn(name = "instrument_code_type", referencedColumnName = "code_type", insertable = false, updatable = false)
@ManyToOne(optional = false)
private InstrumentCodeType instrumentCodeType1;
@JoinColumn(name = "instrument_id", referencedColumnName = "id", insertable = false, updatable = false)
@ManyToOne(optional = false)
private Instrument instrument;

@EmbeddedId の詳細 (InstrumentExtRefPK) を含むエンティティ クラスは次のようになります。

@Embeddable
public class InstrumentExtRefPK implements Serializable {
@Basic(optional = false)
@NotNull
@Column(name = "instrument_id")
private int instrumentId;
@Basic(optional = false)
@NotNull
@Size(min = 1, max = 10)
@Column(name = "instrument_code_type")
private String instrumentCodeType;

クラス InstrumentCodeType は、主キー code_type (参照される列) を持つテーブル instrument_code_type を参照します。クラス Instrument は、列 "id" (参照される列) と列 "exchange_exchange_code" で構成される複合主キーをそれ自体が持つテーブルinstrument を参照します。

エラー メッセージから、InstrumentExtRef エンティティの複合主キーが問題であることは明らかですが、他の同様の (ただしまったく同じではない) 問題の調査に基づいて、エンティティ クラスは問題ないように見えます。しかし、私はこれに比較的慣れていないため、何かが欠けている可能性があります。

4

1 に答える 1

1

エンティティ クラスでの複合キーの作成/使用についてさらに調査を行った後、受け取ったエラー メッセージに微妙な点があることがわかりました。

「... @JoinColumn* s *を使用して結合列ごとに指定する必要があります」。@JoinColumns アノテーションを使用していませんでした。または、少なくとも Netbeans はエンティティ クラスをそのように作成しませんでした。おそらく、各結合列が異なるソース エンティティ/テーブルからのものであるためです。

次のようにエンティティ クラスを修正した後、プロジェクトを正常にデプロイできました。

    @JoinColumns({
    @JoinColumn(name = "instrument_code_type", referencedColumnName = "code_type",    insertable = false, updatable = false),
    @JoinColumn(name = "instrument_id", referencedColumnName = "id", insertable = false, updatable = false)})
private InstrumentCodeType instrumentCodeType1;
private Instrument instrument;

問題が何であるかを確認し始めたのはここでした 。

私の次の問題は、複合主キーが 2 つの異なるエンティティ (instrument と instrumentCodeType) からの列で構成されているという事実に関係があると思います。しかし、今のところ、上記の変更により、ビルドの問題を回避できました。次の問題が発生した場合は、個別に対処します。

于 2013-09-29T02:41:15.540 に答える