0

jaxb を使用して xml ドキュメントを解析し、JPA を使用してデータベースに挿入するアプリケーションを作成しました。

3 つの JPA エンティティがあります。

1.ItemEntity 2.PromotionEntity 3.SellPriceEntity

item エンティティは、PromotionEntity と 1 対 1 の関係を持ち、SellPrice エンティティと 1 対 1 の関係を持ちます。

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、DESCRIPTION extended_description、extended_description_2、gst_code、image_file_name、item_no、out_of_stock_ind、pack_qty、promions_id、sell_price_id、selling_unit、size_applable、stock_available、spplr_no、bolume、web_gdescripation、web_descripation、web_color_descripation、web_ged、web_gedescripution ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)} [code= 1366、状態 = HY000] 失敗したオブジェクト: 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 が....

com.mysql.jdbc.JDBC4PreparedStatement@6d66cc49:

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 ** と表示されます。そうですか?多分これがデータ型エラーが発生する理由です。

ありがとう

4

1 に答える 1

1

あなたが投稿したモデルとも矛盾する説明から、あなたが何を求めているのかは明らかではありません。joincolumn は、ターゲット エンティティで参照する外部キー フィールド名と主キーを指定するために使用されます。しかし、JPA はこれを参照先エンティティの主キーにする必要があるため、マッピングは "ITEM"."PROMOTION_ID" を使用して "PROMOTION"."ID" を参照することになります。「PROMOTION_ID」フィールドのいずれかがテーブルの 1 つ (商品テーブルまたはプロモーション テーブル) に存在しないため、例外が発生します。

親テーブルへの外部キーを持つテーブルを決定し、そこから移動します。表示されているモデルに含まれる 3 つのエンティティに対して単一の自動生成された pk 値を再利用することに意味があるかどうかはわかりません。これは、id セットを取得するエンティティなしでは他の 2 つのエンティティが存在できないことを意味するためです。たとえば、新しいプロモーションを作成して古いプロモーションを維持する方法はありません。とはいえ、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 セットを取得するために使用できるアイテムまたはプロモーションとの関係を持つことができます。

于 2013-10-16T05:02:28.213 に答える