【问题标题】:JPA One to One entities - cannot insertJPA 一对一实体 - 无法插入
【发布时间】:2013-10-16 01:55:16
【问题描述】:

我编写了一个应用程序,它使用 jaxb 解析 xml 文档,然后使用 JPA 插入数据库。

我有三个 JPA 实体。

1.ItemEntity 2.促销实体 3.SellPriceEntity

item 实体与 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_GARIN) , DESCRIPTION, EXTENDED_DESCRIPTION, EXTENDED_DESCRIPTION_2, GST_CODE, IMAGE_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 (?, ?, ?, ? , ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)} [代码=1366,状态=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 是....

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 **。那正确吗?也许这就是我收到数据类型错误的原因。

谢谢

【问题讨论】:

  • 尝试使用@Column(name = "PROMOTION_ID", referencedColumnName="InsertColumnJoinHere")

标签: java jpa


【解决方案1】:

从描述中看不清楚你想要什么,这也与你发布的模型冲突。连接列用于指定外键字段名称以及它在目标实体中引用的主键。但是 JPA 要求它是被引用实体中的主键,因此您的映射最终使用“ITEM”.“PROMOTION_ID”来引用“PROMOTION”.“ID”。您会得到例外,因为“PROMOTION_ID”字段在其中一张表上不存在 - 无论是商品表还是促销表。

确定哪个表将具有父表的外键并从那里开始。我不确定为显示的模型中涉及的 3 个实体重用一个自动生成的 pk 值是否有意义,因为这意味着如果没有获得 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 集的项目或促销有关系。

【讨论】:

  • 好的,感谢您的 cmets。我现在明白在所有三个实体中使用一个键是没有意义的。所以回到计划 A。使用我上面的设置,我将项目表更改为有一个名为promotion_id 的字段。这改变了我的错误。我已经更改了我原来的帖子以反映这一点。
  • 关于您上一个答案的问题。如果我想在所有三个实体中都有一个 load_id,我不能使用共享 pk...stackoverflow.com/questions/787698/…?
  • item中promotion_id字段应该引用promotion中的id,所以应该是long。至于链接,答案已过时。 JPA 2.0 支持派生 ID。
  • 那么你是说我在哪里定义了.... private PromotionEntity Promotion .... 需要是private Long PromotionId?或者你是说我需要 ...private PromotionEntity 促销和 Long PromotionId ? ...感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
  • 2015-07-02
  • 2021-10-25
  • 2011-10-09
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
相关资源
最近更新 更多