Spring API Rest-带JPA和Hibernate的OneToMany/ManyTone
我与这两个实体有以下关系 ·体育运动有许多体育翻译Spring API Rest-带JPA和Hibernate的OneToMany/ManyTone,spring,hibernate,rest,jpa,Spring,Hibernate,Rest,Jpa,我与这两个实体有以下关系 ·体育运动有许多体育翻译 @Entity @Table(name = "sportstranslation") public class SportTranslation implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @C
@Entity
@Table(name = "sportstranslation")
public class SportTranslation implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "sportstranslation_id")
private long idSportTranslation;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "sport_id", nullable = true)
private Sport sport;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "language_id", nullable = true)
private Language languageId;
@Column(name = "name")
private String name;
·体育翻译属于体育
·是双向的
当我尝试从SportTranslation访问Sport时,收到以下错误
java.lang.StackOverflowError: null
at java.util.AbstractCollection.toString(AbstractCollection.java:454) ~[na:1.8.0_191]
at org.hibernate.collection.internal.PersistentBag.toString(PersistentBag.java:510) ~[hibernate-core-5.0.12.Final.jar:5.0.12.Final]
错误不清楚,表也不是空的
·我有经典的Spring MVC架构
控制器
@RestController
@RequestMapping("/api/public/sports")
public class SportController implements ISportsController {
Logger logger = LoggerFactory.getLogger(SportController.class);
@Autowired
private SportsMethods sportMethods;
@GetMapping(value = "/")
@Override
public ResponseEntity<List<SportDTO>> getSports(Pageable pageable) {
logger.info("--- Retrieve name of class --- : " +this.getClass().getSimpleName() + " --- Method name --- : " + new Object(){}.getClass().getEnclosingMethod().getName());
List<SportDTO> sportsMethodsList = sportMethods.retreiveListSports(pageable);
logger.info("--- Final list ---" + sportsMethodsList);
return new ResponseEntity<List<SportDTO>>(sportsMethodsList,
(sportsMethodsList == null || sportsMethodsList.isEmpty()) ? HttpStatus.NO_CONTENT : HttpStatus.OK);
}
}
·语言是正确的,但这不是问题,问题在于体育
有人能帮我吗?我建议您的实体关联更新如下:
@Entity
@Table(name = "sport")
public class Sport implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "sport_id")
private Long id;
@Column(name = "clave")
private String clave;
@OneToMany(mappedBy = "sport", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
private List<SportTranslation> sportTranslation;
@Entity
@Table(name = "sportstranslation")
public class SportTranslation implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "sportstranslation_id")
private long idSportTranslation;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "sport_id", nullable = true)
private Sport sport;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "language_id", nullable = true)
private Language languageId;
@Column(name = "name")
private String name;
另外,请使用@Transactional注释获取数据的服务方法 向我们显示实体类代码。@AdityaNarayanDixit很抱歉我忘记了是的,您有一个StackOverflower错误,因为您有一个循环依赖项。最好使用“mappedBy”进行私人列表翻译;而不是一列。您肯定应该展示SQL并仔细检查它。您的模式中似乎有太多名为sport_id的列,这会让人困惑。您在这里转储了太多的代码,您需要首先自己进行一些调试,并缩小问题的范围。在我的实体运动中,我不能将属性与注释@JoinColumn一起使用,可能是与我的jpa版本一起使用?它可以工作,但我做了不同,@OneToManymappedBy=sport,cascade={CascadeType.ALL},orphanRemoving=true,fetch=FetchType.LAZY
Logger logger = LoggerFactory.getLogger(SportAdapter.class);
@Autowired
private SportTranslationAdapter sportTranslationAdapter;
public List<SportDTO> convertListSport2ListSportDTO(List<Sport> sportList) {
logger.info("--- Sport List adapter" + sportList);
List<SportDTO> sportDTOList = new ArrayList<SportDTO>();
for (Sport sport : sportList) {
SportDTO sportDTO = new SportDTO();
sportDTO.setId(sport.getId());
sportDTO.setClave(sport.getClave());
sportDTO.setSportTranslationDTO(sportTranslationAdapter.convertSportTranslation2SportTranslationDTO(sport.getSportTranslation()));
sportDTOList.add(sportDTO);
}
logger.info("--- Sport DTO List adapter" + sportDTOList);
return sportDTOList;
}
@Component
public class SportTranslationAdapter {
Logger logger = LoggerFactory.getLogger(SportTranslationAdapter.class);
public List<SportTranslationDTO> convertSportTranslation2SportTranslationDTO(List<SportTranslation> list) {
List<SportTranslationDTO> sportTranslationDTOList = new ArrayList<SportTranslationDTO>();
for (SportTranslation sportTranslation : list) {
SportTranslationDTO sportTranslationDTO = new SportTranslationDTO();
sportTranslationDTO.setSportId(sportTranslation.getSport().getId());
sportTranslationDTO.setName(sportTranslation.getName());
sportTranslationDTOList.add(sportTranslationDTO);
}
return sportTranslationDTOList;
}
}
@Entity
@Table(name = "sport")
public class Sport implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "sport_id")
private Long id;
@Column(name = "clave")
private String clave;
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "sport_id")
private List<SportTranslation> sportTranslation;
@Entity
@Table(name = "sportstranslation")
public class SportTranslation implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "sportstranslation_id")
private long idSportTranslation;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "sport_id", nullable = true)
private Sport sport;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "language_id", nullable = true)
private Language languageId;
@Column(name = "name")
private String name;
@Entity
@Table(name = "sport")
public class Sport implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "sport_id")
private Long id;
@Column(name = "clave")
private String clave;
@OneToMany(mappedBy = "sport", cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
private List<SportTranslation> sportTranslation;
@Entity
@Table(name = "sportstranslation")
public class SportTranslation implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "sportstranslation_id")
private long idSportTranslation;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "sport_id", nullable = true)
private Sport sport;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "language_id", nullable = true)
private Language languageId;
@Column(name = "name")
private String name;