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 + EclipseLink+ HSQLDB 不创建表
JPA 2.1、Eclipselink、SQL Server、Spring - NamedStoredProcedureQuery 结果映射