0

私は4つのエンティティを持っています、

purchaseRequest - ファンディング - lineItemFunding purchaseRequest - lineItem - lineItemFunding - ファンディング

私はJAXBを使用@XmlTransientlineItemFundingており、ManyToOne関係にあります。

purchaseRequest-> -から来るときfundingはスキャンしたくありませんが、 -> -> ->lineItemFundingから来るときはスキャンします。のディープスキャンを実行したい。私が遭遇する問題は、 の内部で使用すると完全に機能しますが、削除すると次のエラーが発生することです。purchaseRequestlineItemlineItemFundingFundingFunding@XmlTransientgetFunding()lineItemFunding

Caused by: com.sun.istack.SAXException2: 
A cycle is detected in the object graph. 
This will cause infinitely deep XML: 
org.company.com.entities.Funding@2a2 
-> org.company.com.entities.LineItemFunding@82 
-> org.company.com.entities.Funding@2a2

だから私の質問は、資金調達エンティティから lineItemFunding でディープスキャンを実行しようとするのをどのように防ぐことができるかということです. 以下は私のソースです。

購入依頼

@OneToMany(mappedBy = "purchaseRequest", cascade = CascadeType.ALL, orphanRemoval = true)
private List<LineItem> lineItems;

@OneToMany(mappedBy = "purchaseRequest", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Funding> fundings;

資金調達

@OneToMany(mappedBy = "funding", cascade = CascadeType.ALL, orphanRemoval = true)
private List<LineItemFunding> lineItemFundings;

@XmlTransient
@ManyToOne
@JoinColumn(name = "purchase_request_id", nullable = false)
private PurchaseRequest purchaseRequest;

ラインアイテム

@OneToMany(mappedBy = "lineItem", cascade=CascadeType.ALL, orphanRemoval=true, fetch=FetchType.EAGER)
private List<LineItemFunding> lineItemFundings;

@XmlTransient
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "purchase_request_id", nullable = false)
private PurchaseRequest purchaseRequest;

LineItemFunding

@XmlTransient
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "line_item_id", nullable = true)
private LineItem lineItem;

// lineItem 方向から資金調達エンティティをディープ スキャンするために、この xmlTransient を削除する必要がありますが、資金調達方向には分割します。lineItemFunding は lineItem への資金調達の単なる結合であるため、資金調達は linItemFunding を詳細にスキャンする必要はありません。

@XmlTransient
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "funding_id", nullable = true)
private Funding funding;

ありがとう

4

2 に答える 2

0

自分の質問を解決しました。lineItemFunding の @ManyToOne 関係から @XmlTransient アノテーションを削除し、そのアノテーションを Funding の @OneToMany 関係に適用するだけで済みました。

于 2012-08-09T18:54:32.457 に答える
0

永続化レイヤー以外の場所で使用されるエンティティを使用しないようにしました。これは、エンティティが波打たれる可能性があり、使用する永続化フレームワークによっては、常にこれに問題があったためです。だから私はDTOを使用しました。(古い方法かもしれませんが、問題は解決しました)

ただし、最近これを見たので、あなたの場合は http://wiki.eclipse.org/EclipseLink/Examples/SDO/JPAに役立つかもしれません

于 2012-08-09T18:31:46.520 に答える