【发布时间】: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