JPA eclipselink坚持没有主键但有两个外键的实体

Posted

技术标签:

【中文标题】JPA eclipselink坚持没有主键但有两个外键的实体【英文标题】:JPA eclipselink persist entity that has no primary key but two foreign keys 【发布时间】:2020-12-25 01:42:34 【问题描述】:

我是java EE的新手,并且是自学的,所以请耐心等待。到目前为止,我的数据库中有 3 个简单的表:

Sales Products
Sale_id Product_id
Sale_details
Saleid_fk
Productid_fk (fk)
Quantity_sold

如何在不创建 sale_details 实体的情况下保留新的 sale_details。因为 Java 不允许我在没有主键的情况下将 sale_details 命名为 @Entity。 这个当前代码给了我一个错误,说明我需要声明一个主键。我尝试根据 *** 上的答案使用 Idclass,但它没有做任何事情。

@Entity
@Table(name="sale_details")
@IdClass(value = SaleDetails.class)
public class SaleDetails implements Serializable 

    @Column(name = "saleid_fk")
    private int saleid_fk;

    @Column(name = "productid_fk")
    private String productid_fk;

    @Column(name = "quantity_sold")
    private int quantity_sold;

我在这里错过了什么?

【问题讨论】:

你能分享确切的表定义吗?特别是:您能否验证表sale_details 上的(Sale_id, Product_id) 对是否受到UNIQUE 约束的保护? --- 代码注释:SaleDetails 类中的列名与表sale_details 中的列名不匹配。 @Turing85 我发布了表格定义,我手动输入了表格图表,所以这就是为什么它们不一样,我为混乱道歉。 Sale_id 和 Product_id 不是唯一的,因为一个 sane_id 可能有多个 sale_details 和/或一个产品有多个 sale_details。 在这种情况下,(saleid_fk, quantity_sold) 对是唯一的,可用于 JPA @EmbeddedId@IdClass。详情请见this article at Baelung。 备注:我质疑将(saleid_fk, quantity_sold) 设为唯一的决定。如果在同一销售中以相同的数量出售两个单独的物品怎么办?目前的结构不允许这种情况。 @Turing85 不会吗?它们将具有相同的 sale_id 和数量,但具有不同的 Product_id。我尝试了 Idclass,得到了这个错误:异常描述:无效的复合主键规范。主键类[com.owl.server.objects.SaleDetails]和实体bean类[class com.owl.server.objects.SaleDetails]中的主键字段或属性的名称必须对应,并且它们的类型必须对应。是一样的。 【参考方案1】:

您可以将主 ID 设置为自动增量而不使用它。

【讨论】:

以上是关于JPA eclipselink坚持没有主键但有两个外键的实体的主要内容,如果未能解决你的问题,请参考以下文章

JPA @EmbeddedId 未生成序列

使用 JPA 检索多个对象

JPA + EclipseLink+ HSQLDB 不创建表

JPA 2.1、Eclipselink、SQL Server、Spring - NamedStoredProcedureQuery 结果映射

如何在 JPA 中生成自定义 ID

EclipseLink - 在执行查询期间从该行读取的主键被检测为空。主键不能包含 null