2013-10-16 61 views
0

我已經編寫了一個應用程序,該應用程序使用jaxb解析xml文檔,然後使用JPA插入到數據庫中。JPA One to One實體 - 無法插入

我有三個JPA實體。

1.ItemEntity 2.PromotionEntity 3.SellPriceEntity

該項目的實體具有與PromotionEntity並與SellPrice Entitiy以一對一的關係的一對一的關係。

當嘗試只使用ItemEntity插入數據庫時​​,我的應用程序工作並且將項目記錄插入到數據庫中。但是,當我嘗試使用ItemEntity,PromotionEntity和SellPriceEntity插入數據庫時​​,我開始出現錯誤。

org.apache.openjpa.persistence.PersistenceException:錯誤的整數值:'\ xAC \ xED \ x00 \ x05sr \ x00,org.apache.camel.example.etl.PromotionEntity $ \ x0C \ xF5 \ xF1 \ x08 \ x0B \ xA2 \ x81 \ x02 \ x00 \ x05L \ x00 \ x02idt \ x00 \ x10'列1中的列'PROMOTION_ID'{prepstmnt 1554452939 INSERT INTO item(id,ATTRIBUTE_1,ATTRIBUTE_3,ATTRIBUTE_2,BRAND_LOGO_FILE_NAME,BRAND_NAME,CLASS_NO, DEFAULT_MARGIN,說明,EXTENDED_DESCRIPTION,EXTENDED_DESCRIPTION_2,GST_CODE,映像文件名,ITEM_NO,OUT_OF_STOCK_IND,PACK_QTY,PROMOTION_ID,SELL_PRICE_ID,SELLING_UNIT,SIZE_APPLICABLE,STOCK_AVAILABLE,SPPLR_NO,體積,WEB_AGE_GROUP,WEB_COLOR_DESCRIPTION,WEB_DESCRIPTION,WEB_SIZE_DESCRIPTION,WEIGHT)VALUES(?,?,?, ,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? } [code = 1366,state = HY000] FailedObject:org.apache.camel.example .etl.ItemEntity @ 333f8b4c

這裏是我如何設定我的實體bean起來......

@Entity(name = "item") 
public class ItemEntity implements java.io.Serializable { 
private static final long serialVersionUID = -9063279672222036437L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    @Column(name = "ITEM_NO") 
    private String itemNo; 
    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name="PROMOTION_ID") 
    private PromotionEntity promotion; 
    @OneToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name="SELL_PRICE_ID") 
    private SellPriceEntity sellPrice; 

     gets and sets... 

促進實體

@Entity(name = "promotion") 
public class PromotionEntity implements java.io.Serializable { 
    private static final long serialVersionUID = 2597721500656837249L; 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    @Column(name = "PROMOTION_ID") 
    private String promotionId; 
    @Column(name = "PROMOTION_PRICE") 
    private String promotionPrice; 

    gets and sets... 

售價實體

@Entity(name = "sell_price") 
public class SellPriceEntity implements java.io.Serializable { 
private static final long serialVersionUID = -205334787672950850L; 
@Id 
@GeneratedValue(strategy = GenerationType.AUTO) 
private Long id; 
@Column(name = "SELL_PRICE_EFFECTIVE_DATE_1") 
private String sellPriceEffectiveDateOne; 
@Column(name = "SELL_PRICE_1") 
private String sellPriceOne; 

    gets and sets...  

我相信我已經正確定義了關係字段,因此不確定發生了什麼問題。在試圖通過JDBCStoreManager類調試,我可以看到正在執行的SQL是....

[email protected]

INSERT INTO item (
id, 
ATTRIBUTE_1, 
ATTRIBUTE_3, 
ATTRIBUTE_2, 
BRAND_LOGO_FILE_NAME, 
BRAND_NAME, 
CLASS_NO, 
DEFAULT_MARGIN, 
DESCRIPTION, 
EXTENDED_DESCRIPTION, 
EXTENDED_DESCRIPTION_2, 
GST_CODE, I 
MAGE_FILE_NAME, 
ITEM_NO, 
OUT_OF_STOCK_IND, 
PACK_QTY, 
PROMOTION_ID, 
SELL_PRICE_ID, 
SELLING_UNIT, 
SIZE_APPLICABLE, 
STOCK_AVAILABLE, 
SPPLR_NO, 
VOLUME, 
WEB_AGE_GROUP, 
WEB_COLOR_DESCRIPTION, 
WEB_DESCRIPTION, 
WEB_SIZE_DESCRIPTION, 
WEIGHT) 
VALUES (701, '', '', '', '', '', '350', '.00', 'KHOMBU APFOOTA KOKO HIGH', '', '', '1', '', '93501250080', 'Y', '0', ** STREAM DATA **, ** STREAM DATA **, 'Each', 'Y', '0', 'KHOMBU', '.0000', '', 'Black', '', '8', '.00') 

在那裏我應該將promotion_id和sell_price_id它告訴我** STREAM DATA **。是對的嗎?也許這就是我得到一個數據類型錯誤的原因。

感謝

+0

嘗試使用'@Column(name =「PROMOTION_ID」,referencedColumnName =「InsertColumnJoinHere」)' – nachokk

回答

1

目前尚不清楚你的描述,這也與您發佈的模型衝突所追求的。聯合列用於指定外鍵字段名稱以及它在目標實體中引用的主鍵。但是JPA要求這是被引用實體的主鍵,所以你的映射最終使用「ITEM」,「PROMOTION_ID」來引用「PROMOTION」,「ID」。由於「PROMOTION_ID」字段上不存在其中一個表 - 無論是商品表還是促銷表,您都會得到例外。

決定哪個表將具有父表的外鍵並從那裏開始。我不確定是否有一個自動生成的pk值被重用於所示模型中涉及的3個實體是有意義的,因爲這意味着其他兩個實體永遠不可能與獲取id集合的實體不存在。例如,將無法創建新的促銷活動並保留舊促銷活動。也就是說,在JPA 2.0中可以將關係設置爲@ID。所以,你可以從項目中刪除ID是這樣的:

@Column(name = "ITEM_NO") 
private String itemNo; 
@Id 
@OneToOne(cascade = CascadeType.ALL) 
@JoinColumn(name="PROMOTION_ID") 
private PromotionEntity promotion; 
@OneToOne(cascade = CascadeType.ALL) 
@JoinColumn(name="SELL_PRICE_ID") 
private SellPriceEntity sellPrice; 

這將對商品使用價值產生長期的ID從推廣其ID爲好,並將其存儲在「PROMOTION_Id」字段。你可以做一些類似於SellPriceEntity的事情,所以它可以用來獲得它的id集合的item或promotion。

+0

好的感謝您的意見。我現在明白,在所有三個實體中都有一個密鑰是沒有意義的。所以回到計劃A.使用我有上面的設置我改變了項目表有一個名爲promotion_id的字段。這改變了我的錯誤。我改變了我原來的帖子來反映這一點。 – Richie

+0

關於你最後答案的問題。如果我想要在所有三個實體中都有一個load_id,我不能使用共享pk來執行它... http://stackoverflow.com/questions/787698/jpa-hibernate-one-to-one-relationship? – Richie

+0

item中的promotion_id字段應該在促銷中引用id,所以應該是很長的。至於鏈接,答案是過時的。 JPA 2.0支持衍生ID。 – Chris