【问题标题】:JPA bidirectional mapping not fetching deep mapped dataJPA双向映射未获取深度映射数据
【发布时间】:2019-03-01 13:54:08
【问题描述】:

我有以下具有双向映射的 JPA 实体。我正在尝试将所有 featureGroup 提取到 DTO 中。

如果我确实在 featureGroup 中找到所有并迭代以获取其功能。它不来。我对 JPA 还不是很熟悉。我的做法对吗?

以下是我的实体。

@Entity
@Table(name="application")
@Data
class Application{
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) id;
    name;
    @OneToMany(mappedBy="application") 
    private Set<AppFeatureGroup> appFeatureGroup;
}

然后

@Entity
@Table(name="appfeaturegroup")
@Data
class AppFeatureGroup {
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) id;
    title;
    @OneToMany(mappedBy="appfeaturegroup")
    private Set<AppFeature> appFeature;
    @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="id", insertable=false, updatable=false)
    private Application application;
}

然后

@Entity
@Table(name="appfeature")
@Data
class AppFeature{
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) id;
    title;
    @OneToMany(mappedBy="appFeature")
    private Set<AppSubFeature> appSubFeature;
    @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="id", insertable=false, updatable=false)
    private AppFeatureGroup appFeatureGroup;
}

@Entity
@Table(name="appsubfeature")
@Data
class AppSubFeature{
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) id;
    title;
    @ManyToOne(cascade=CascadeType.ALL) @JoinColumn(name="id", insertable=false, updatable=false)
    private AppFeature appFeature;
}

然后

我尝试获取如下对象:

List<AppFeatureGroup> appFeatureGroupList = appFeatureGroupRepository.finAll()
//Also tried from Application application = findById(id) and from application also I tried to get the deep objects

for(AppFeatureGroup appFeatureGroup : appFeatureGroupList){
    //I get id and title. But,
    Set<AppFeature> appFeature = appFeatureGroup.getAppFeature();//This is empty    
}

我实施的是不正确的吗?我也试过fetch=FethType.EAGER。但还是不行。

【问题讨论】:

  • 在您的 AppFeatureGroup 中,您有 @OneToMany(mappedBy="appFeature") 修复此问题,重试可能会解决(尚未详细查看)
  • @Mahieus,这是什么错误?
  • 抱歉忘记发布正确的注释,但它可能应该是该类中的@OneToMany(mappedBy="appGroupFeature")
  • 对不起。我没有在这里复制确切的代码。当我起草时,有一种类型。但是,映射很好。我确定了这个问题。我使用 lombok 使用 @Data 注释。这已经给出了问题。我删除了 lombok 并创建了实际的 getter setter。现在它工作正常。龙目岛毁了我的一天。

标签: java spring-data-jpa hibernate-mapping bidirectional-relation


【解决方案1】:

我已经从 lombok 中删除了@Data。现在它工作正常。由于这个龙目岛,我得到了如下错误:

WARN  [org.hibernate.engine.loading.internal.LoadContexts] (default task-1) HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext

另一个错误是,

jpa Exception occurred: com.sun.jdi.InvocationException occurred invoking method..

当有多个映射时,不要将@Data 用于Entity

【讨论】:

    【解决方案2】:

    这可能是因为使用了 lombok 生成的 equals、hashcode 和 toString 方法(通过 @Data 注释),它们包含实体之间的双向链接。因此调用它们可能会产生 StackOverflowException 等异常和许多其他异常。

    将@Data 替换为@Setter、@Getter、@EqualsAndHashcode(exclude = {})、@ToString(exclude ={})。

    【讨论】:

      【解决方案3】:

      或者,如果您没有使用 Lombok 但遇到此问题,请从 equals/hashcode/toString 中排除子实体中的父属性。

      【讨论】:

      • 您能否为您的回答提供一些解释?
      • 简短的回答是在子实体的 equals/hashcode/toString 中使用父属性会产生彼此的递归调用。我在这个主题上找到了更多细节 - thorben-janssen.com/…
      猜你喜欢
      • 2012-01-04
      • 2023-03-04
      • 2012-03-27
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 2016-04-19
      • 2020-05-10
      • 2014-09-18
      相关资源
      最近更新 更多