3

2つのテーブルがあります。アセットテーブル

ASSET_ID SYSIBM INTEGER40いいえ
USER_IDSYSIBMINTEGER40いいえ
ASSET_TYPE_IDSYSIBMSMALLINT20いいえ
ACCESSIBILITY_IDSYSIBMSMALLINT20はい
DOWNLOAD_TYPE_IDSYSIBMSMALLINT20いいえ
ASSET_STATUS_IDSYSIBMSMALLINT20いいえ
ASSET_MARKETING_IDSYSIBMSMALLINT
20

およびアクセス可能性テーブル

ACCESSIBILITY_ID SYSIBM SMALLINT20いいえ
ACCESSIBILITY_DESCSYSIBMVARCHAR500いいえ

私は2つの豆を持っています、

アセットビーン

@Column(name="ASSET_ID")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int assetId;

@Column(name="DATE_CREATED")
private Timestamp dateCreated;

@Column(name="LAST_UPDATED")
private Timestamp lastUpdated;

@Column(name="DATE_PUBLISHED")
private Timestamp datePublished;

@Column(name="ASSET_SURVEY")
private Short assetSurvey;

@Column(name="ASSET_HELP")
private Short assetHelp;

@Column(name="ACCEPTED_TERMS")
private Short acceptedTerms;

@Column(name="ASSET_DESC")
@Lob
private String assetDesc;

@Column(name="ASSET_ALIAS")
private String assetAlias;

@Column(name="ASSET_TITLE")
private String assetTitle;

@Column(name="ASSET_SUMMARY")
private String assetSummary;

@Column(name="ASSET_URL")
private String assetUrl;

@Column(name="ASSET_ORIGINALITY")
private Short assetOriginality; 

@Column(name="ASSET_INVENTION")
private Short invationDisclosure;

@Column(name="ASSET_PRIVACY")
private String  privacyCompliance;  


@ManyToOne
@JoinColumn(name="ASSET_PI_SPI_ID")
private AssetPiSpi assetPiSpiId;

@ManyToOne
@JoinColumn(name="ASSET_MARKETING_ID")
@ForeignKey
private AssetMarketing assetMarketingId;    

@ManyToOne(cascade=CascadeType.REMOVE,fetch=FetchType.LAZY)
@JoinColumn(name="ACCESSIBILITY_ID")
@ForeignKey
private Accessibility accessibilityId;

とアクセシビリティ

@Column(name="ACCESSIBILITY_ID")
private short accessibilityId;

@Column(name="ACCESSIBILITY_DESC")
private String accessibilityDesc;

@OneToMany(mappedBy="accessibilityId",cascade=CascadeType.REMOVE,fetch=FetchType.LAZY)  
private Set<Asset> assetCollection;

EntitiManager.flush()がManagerBeanで呼び出されたとき

 em.persist(asset);  
 em.flush();

私は得ています

javax.ejb.EJBException:ネストされた例外を参照してください。ネストされた例外は次のとおりです。org.apache.openjpa.persistence.InvalidStateException:フィールド「com.ibm.tapフラッシュ中の.ejb.dao.entity.Asset.accessibilityId"。ただし、このフィールドではカスケードの永続化は許可されません。管理されていないオブジェクトまたは管理されていないオブジェクトに永続的に関連付けられているグラフをフラッシュすることはできません。推奨されるアクション:a)このフィールドのカスケード属性をCascadeType.PERSISTまたはCascadeType.ALL(JPAアノテーション)または「persist」または「all」(JPA orm.xml)に設定します。b)カスケード永続化をグローバルに有効にします。c)手動でフラッシュする前に、関連するフィールド値を保持します。d)参照が別のコンテキストに属している場合、StoreContext.setAllowReferenceToSiblingContext()を設定して、それへの参照を許可します。FailedObject:com.ibm.tap.ejb.dao.entity.Accessibility@169e3455

Assetクラスをに変更してみました

@ManyToOne(cascade=CascadeType.PERSIST,fetch=FetchType.LAZY)
@JoinColumn(name="ACCESSIBILITY_ID")
@ForeignKey
private Accessibility accessibilityId;

これを行うと、javax.ejb.EJBExceptionが発生します。ネストされた例外を参照してください。ネストされた例外は次のとおりです。org.apache.openjpa.persistence.EntityExistsException:OID「1」のタイプ「com.ibm.tap.ejb.dao.entity.Accessibility」のオブジェクトがこのコンテキストにすでに存在します。もう1つは永続化できません。FailedObject:com.ibm.tap.ejb.dao.entity.Accessibility@166c27b9

これは、私がすでに持っているテーブルを永続化しようとしていることを私には理解しています。私は何が間違っているのですか?

4

1 に答える 1

5

あなたが抱えている問題は、外部キーが原因ではありません。何が起こっているかというと、Asset オブジェクトに、OpenJPA によって管理されていない Accessibility オブジェクトが含まれているということです。これを修正する方法は、アクセシビリティ レコードの状態によって異なります。

  1. アクセシビリティ レコードはデータベースに既に存在しますか? その場合は、最初に getEntityManager.find(Accessibility.class, uid) を使用してロードし、Asset オブジェクトを永続化する前に Asset オブジェクトに設定します。

  2. アクセシビリティ レコードがまだ永続化されていない場合は、まず "getEntityManager.persist(accessibility)" を使用して永続化してから、永続化を試みる前にそれを Asset オブジェクトに設定する必要があります。または、次のように、アクセシビリティ コレクションのカスケード タイプを永続化できるように変更することもできます。

@ManyToOne(cascade=cascade={ CascadeType.PERSIST, CascadeType.REMOVE },fetch=FetchType.LAZY)
@JoinColumn(name="ACCESSIBILITY_ID")
@外部キー
プライベートアクセシビリティaccessibilityId;

カケードを変更すると、Asset オブジェクトを永続化すると、Asset オブジェクトの永続化されていない Accessibility オブジェクトが自動的に永続化されます。

于 2012-09-19T04:19:14.987 に答える