【问题标题】:Multiple representations of the same entity in OracleOracle 中同一实体的多个表示
【发布时间】:2021-11-01 23:10:44
【问题描述】:

我有两个表,第一个是TB_RECIPE_DATA,其中PK 是ID_RECIPE 字段。第二个表是TB_RECIPE_ITEM,其中PK由三个字段组成:ID_RECIPECD_LOTCD_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


【解决方案1】:

发生错误是因为例如在更改配方 A 及其各自的项目时,每个项目都有配方 A 作为主键的一部分,所以我会改变食谱两次。解决方案是在这种情况下双向工作。如果有人遇到类似问题,我会分享我的解决方案。

主类:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "TB_RECIPE_DATA", schema = "A_SAMPLE")
public class Recipe {

    @Id
    @Column(name = "ID_RECIPE")
    private Long id;

    @OneToMany(mappedBy = "recipe", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
    private List<RecipeItem> items;
}

儿童班:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "TB_RECIPE_ITEM", schema = "A_SAMPLE")
public class RecipeItem {
    
    @EmbeddedId
    private RecipeItemPk id;
    
    @Column(name = "QT_PURCHASE")
    private Long purchaseQuantity;

    @Column(name = "FL_AVAILABLE")
    private Boolean available;

    @ManyToOne
    @JoinColumn(name = "ID_RECIPE", insertable = false, updatable = false)
    private Recipe recipe;
}

主键类:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(of = { "id", "lot", "code" })
@Embeddable
public class RecipeItemPk {

    @Column(name = "ID_RECIPE")
    private Long id;

    @Column(name = "CD_LOT")
    private String lot;
    
    @Column(name = "CD_PRODUCT")
    private Long code;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-11
    • 2019-01-31
    • 2014-12-22
    • 1970-01-01
    • 2019-05-14
    • 2017-06-13
    • 2016-03-14
    相关资源
    最近更新 更多