2012-08-02 34 views
3

我有點新的JPA所以裸陪我,但這裏是我迄今爲止.. 我有兩個表.. 資產表如何使OpenJPA的2.2.0不能堅持外鍵

ASSET_ID SYSIBM INTEGER 4 0無
USER_ID SYSIBM INTEGER 4 0無
ASSET_TYPE_ID SYSIBM SMALLINT 2 0無
ACCESSIBILITY_ID SYSIBM SMALLINT 2個0是
DOWNLOAD_TYPE_ID SYSIBM SMALLINT 2 0無
ASSET_STATUS_ID SYSIBM SMALLINT 2 0無
ASSET_MARKETING_ID SYSIBM SMALLINT 2 0是
ASSET_PI_SPI_ID SYSIBM SMALLINT 2個0是

和無障礙環境表

ACCESSIBILITY_ID SYSIBM SMALLINT 2 0無
ACCESSIBILITY_DESC SYSIBM VARCHAR 50 0無

我有兩個豆,

Asset Bean

@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:遇到非託管對象「[email protected]」處於生命週期狀態,非託管,而級聯持久性通過字段「com.ibm.tap .ejb.dao.entity.Asset.accessibilityId「在刷新期間。但是,該字段不允許級聯持續。您無法刷新與非託管對象持久關聯的非託管對象或圖形。建議的操作:a)將此字段的級聯屬性設置爲CascadeType.PERSIST或CascadeType.ALL(JPA註釋)或「persist」或「all」(JPA orm.xml),b)全局啓用cascade-persist,c)手動在沖洗之前堅持相關的字段值。 d)如果引用屬於另一個上下文,則允許通過設置StoreContext.setAllowReferenceToSiblingContext()來引用它。 FailedObject:[email protected]

我試圖改變資產類

@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」類型的對象;另一個不能堅持。 FailedObject:[email protected]

對我來說,我試圖堅持我已經擁有的表。我究竟做錯了什麼?

回答

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") 
@ForeignKey 
private Accessibility accessibilityId; 

如果使cacade變化,那麼你的資產對象的任何非持久輔助對象將是持久化Asset對象時自動保持。