【问题标题】:Loop on SQL select循环 SQL 选择
【发布时间】:2020-07-07 07:27:19
【问题描述】:

我目前正在开发一个运动预报应用程序。在这个应用程序中,我有团队性别(男/女)、运动(足球、橄榄球...)和比赛类型(世界杯...)。 每个比赛类型都有一个标签:例如世界杯。团队性别和运动也有关联。

目前我正在为性别执行删除方法。但我想检查要删除的性别是否与比赛类型相关联。如果是这样,我想抛出一个异常。如果没有,删除是安全的。

删除与比赛类型无关的性别效果很好。但是当我尝试删除一个链接时,应用程序会在尝试获取性别的比赛类型集时循环执行 SQL 请求:

Hibernate: select contesttyp0_.gender as gender3_3_0_, contesttyp0_.id as id1_3_0_, contesttyp0_.id as id1_3_1_, contesttyp0_.gender as gender3_3_1_, contesttyp0_.label as label2_3_1_, contesttyp0_.sport as sport4_3_1_ from contest_type contesttyp0_ where contesttyp0_.gender=?

然后我有一个错误:

2020-07-07 09:15:48.301  WARN 28228 --- [io-8086-exec-10] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: S1000
2020-07-07 09:15:48.301 ERROR 28228 --- [io-8086-exec-10] o.h.engine.jdbc.spi.SqlExceptionHelper   : null

还有很多:

2020-07-07 09:15:48.333  WARN 28228 --- [io-8086-exec-10] o.h.e.loading.internal.LoadContexts      : HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@1fc91d2c<rs=HikariProxyResultSet@2135475200 wrapping Result set representing update count of -1>

最后:

java.sql.SQLException: null

这是我的实体:

@Entity
@Table(name = "contest_type")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
public class ContestTypeEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @Column(nullable = false, unique = true)
    private String label;

    @NotNull
    @ManyToOne(fetch=FetchType.LAZY)
    @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(name="gender")
    private GenderEntity gender;

    @NotNull
    @ManyToOne(fetch=FetchType.LAZY)
    @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(name="sport")
    private SportEntity sport;
}
@Entity
@Table(name = "gender")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
public class GenderEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @Column(nullable = false, unique = true)
    private String label;

    @OneToMany(mappedBy = "gender", cascade = CascadeType.ALL)
    private Set<ContestTypeEntity> contestTypes;
}
@Entity
@Table(name = "sport")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SportEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    @Column(nullable = false, unique = true)
    private String label;

    @OneToMany(mappedBy = "sport", cascade = CascadeType.ALL)
    private Set<ContestTypeEntity> contestTypes;
}

这是我的控制器删除方法:

@DeleteMapping(GET_GENDER_URI)
public ResponseEntity<?> deleteGender(@PathVariable("id") long id) {
    Gender gender = this.genderService.getGender(id);
    String message = this.bundle.getString(DELETE_GENDER);
    this.log.debug(message, id);
    this.genderService.delete(id);
    return new ResponseEntity<>(gender, HttpStatus.ACCEPTED);
}

还有我的服务删除方法:

@Transactional
    public void delete(long id) {

        GenderEntity genderEntity = genderRepository.findById(id).orElseThrow(() -> {
            String pattern = this.bundle.getString(GENDER_WRONG_ID);
            String message = MessageFormat.format(pattern, id);
            return new EntityNotFoundException(message);
        });

        Set<ContestTypeEntity> contestTypeEntities = genderEntity.getContestTypes();
        if(contestTypeEntities.size() > 0) {
            String pattern = this.bundle.getString(GENDER_HAS_CONTEST_TYPE_PARENT);
            String message = MessageFormat.format(pattern,id);
            throw new BadRequestDeleteGenderException(message);
        }

        this.genderRepository.deleteById(genderEntity.getId());
    }

我已经好几天了,我不知道我做错了什么。

【问题讨论】:

    标签: java sql spring-boot hibernate


    【解决方案1】:

    我删除了 GenderEntity 和 SportEntity 中的比赛类型集,然后在比赛类型存储库中发出请求以获取具有我要删除的性别的比赛类型。 它有效!

    我认为当我想删除性别时,应用程序也想删除 ContestTypes 集。然后它进入这个集合并看到 ContestType 有一个性别。然后进入这个性别并看到它有一组 ContestTypes。等等!

    【讨论】:

      猜你喜欢
      • 2015-07-03
      • 2013-02-11
      • 2021-09-22
      • 1970-01-01
      • 2021-09-27
      • 2014-08-05
      • 2019-04-06
      • 2019-04-18
      • 1970-01-01
      相关资源
      最近更新 更多