【发布时间】:2021-11-01 23:10:44
【问题描述】:
我有两个表,第一个是TB_RECIPE_DATA,其中PK 是ID_RECIPE 字段。第二个表是TB_RECIPE_ITEM,其中PK由三个字段组成:ID_RECIPE、CD_LOT和CD_PRODUCT。这两个表是相关的,因此一个配方可以有多个项目。我面临的问题是,当我尝试注册一个包含多个项目的食谱时,我收到一条错误消息“InvalidDataAccessApiUsageException: Multiple representations of the same entity”。当我注册一个只有一个项目的食谱时,它就可以工作。
在我所做的研究中,许多人表示这是由于Cascade,我已经尝试切换到cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH},但没有成功。表的映射是这样完成的:
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "TB_RECIPE_DATA", schema = "A_SAMPLE")
public class Recipe {
@Id
@Column(name = "ID_RECIPE")
private Long id;
@Fetch(FetchMode.SUBSELECT)
@OneToMany(mappedBy = "id", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<RecipeItem> items;
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "TB_RECIPE_ITEM", schema = "A_SAMPLE")
public class RecipeItem {
@Id
@Column(name = "ID_RECIPE")
private Long id;
@Column(name = "CD_LOT")
private String lot;
@Column(name = "CD_PRODUCT")
private Long code;
@Column(name = "QT_PURCHASE")
private Long purchaseQuantity;
@Column(name = "FL_AVAILABLE")
private Boolean available;
}
【问题讨论】:
-
mappedBy = "id" 是不允许的,当这些实体被加载和处理时,你一定会错过一堆警告/错误。这用于指示双向映射,并且必须指向目标实体 (RecipeItem) 中映射回该名称的实体 (Recipe) 的映射。 ID 虽然是一个基本的 Long 映射。这导致多个RecipeItems 被分配相同的ID 值,因为它以某种方式被用作返回Recipe 的外键。我建议在 Hibernate 中出现问题以允许这样做而不会引发错误。
标签: java spring oracle hibernate jpa