花了一天的时间来解决这个问题,但没有发现问题。我不需要完美的解决方案,只要给我指示就是问题所在。我在哪里可以找到有关此事的信息。
我创建了一些实体,其中一些您可以在下面找到(不是所有字段,只是此任务所需的):
@Entity
@Data
@EqualsAndHashCode(exclude = {"teams","organizers"})
public class Event {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(nullable = false)
private String eventName;
@ManyToMany
@JoinTable(name = "event_organizer",
joinColumns = @JoinColumn(name = "event_id"),
inverseJoinColumns = @JoinColumn(name = "organizer_id"))
private Set<Organizer> organizers= new HashSet<>();
@ManyToMany
@JoinTable(name = "event_team",
joinColumns = @JoinColumn(name = "event_id"),
inverseJoinColumns = @JoinColumn(name = "team_id"))
private Set<Team> teams = new HashSet<>();
}
@Entity
@Data
@EqualsAndHashCode(exclude = {"events"})
public class Organizer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(nullable = false)
private String organizerName;
private String organizerLastName;
private String organizerEmailAddress;
private String organizerTelephoneNumber;
@ManyToMany(mappedBy = "organizers")
private Set<Event> events= new HashSet<>();
}
@Entity
@Data
@EqualsAndHashCode(exclude = {"events", "players"})
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(nullable = false)
private String teamName;
@ManyToMany
@JoinTable(name = "team_player",
joinColumns = @JoinColumn(name = "team_id"),
inverseJoinColumns = @JoinColumn(name = "player_id"))
private Set<Player> players = new HashSet<>();
@ManyToMany(mappedBy = "teams")
private Set<Event> events= new HashSet<>();
}
@Entity
@Data
@EqualsAndHashCode(exclude = {"teams"})
public class Player {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(nullable = false)
private String playerName;
private String playerLastName;
private int playerAge;
private String playerNickname;
private String playerEmailAddress;
private String playerTelephoneNumber;
@ManyToMany(mappedBy = "players")
private Set<Team> teams = new HashSet<>();
@Enumerated(value = EnumType.STRING)
private FavouritePosition favouritePosition;
}
我创建了一个引导类,它可以从 data.sql 文件中获取一些数据:
@Component
public class EventBootstrap implements ApplicationListener<ContextRefreshedEvent>{
//There are some Repositories fields and constructor
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
eventRepository.saveAll(getEvent());
}
private List<Event> getEvent() {
List<Event> events = new ArrayList<>();
//Organizers
Optional<Organizer> ostrouchKolobrzeskaOrganizerOptional = organizerRepository.findByOrOrganizerLastName("Ostrouch");
if (!ostrouchKolobrzeskaOrganizerOptional.isPresent()){
throw new RuntimeException("Organizer not found !");
}
Organizer ostrouchKolobrzeskaOrganizer = ostrouchKolobrzeskaOrganizerOptional.get();
Optional<Organizer> kaimWestFootballPitchOrganizerOptional = organizerRepository.findByOrOrganizerLastName("Kaim");
if (!kaimWestFootballPitchOrganizerOptional.isPresent()){
throw new RuntimeException("Organizer not found!");
}
Organizer kaimWestFootballPitchOrganizer = kaimWestFootballPitchOrganizerOptional.get();
//Set 1 organizers
Set<Organizer> organizersSetOne = new HashSet<>();
organizersSetOne.add(kaimWestFootballPitchOrganizer);
organizersSetOne.add(ostrouchKolobrzeskaOrganizer);
//Set 2 organizers
Set<Organizer> organizerSetTwo = new HashSet<>();
organizerSetTwo.add(ostrouchKolobrzeskaOrganizer);
//Team
Optional<Team> jeppesenFootballTeamOptional = teamRepository.findByTeamName("Jeppesen Football Team");
if (!jeppesenFootballTeamOptional.isPresent()){
throw new RuntimeException("Expected football team not found");
}
Team jeppesenFootballTeam = jeppesenFootballTeamOptional.get();
Optional<Team> lufthansaFootballTeamOptional = teamRepository.findByTeamName("Lufthansa Football Team");
if (!lufthansaFootballTeamOptional.isPresent()){
throw new RuntimeException("Expected football team not found");
}
Team lufthansaFootballTeam = lufthansaFootballTeamOptional.get();
//Set 1 team
Set<Team> teamsSetOne = new HashSet<>();
teamsSetOne.add(jeppesenFootballTeam);
teamsSetOne.add(lufthansaFootballTeam);
//Set 2 team
Set<Team> teamsSetTwo = new HashSet<>();
teamsSetTwo.add(lufthansaFootballTeam);
//getPlayer
Optional<Player> przemekPlayerOptional = playerRepository.findByPlayerName("Przemyslaw");
if(!przemekPlayerOptional.isPresent()){
throw new RuntimeException("Expected player not found!");
}
Optional<Player> jakubPlayerOptional = playerRepository.findByPlayerName("Jakub");
if(!jakubPlayerOptional.isPresent()){
throw new RuntimeException("Expected player not found!");
}
Player przemekPlayer = przemekPlayerOptional.get();
przemekPlayer.setFavouritePosition(FavouritePosition.MIDFIELDER);
Player jakubPlayer = jakubPlayerOptional.get();
jakubPlayer.setFavouritePosition(FavouritePosition.ATTACKER);
Set<Player> playersSetOne = new HashSet<>();
playersSetOne.add(przemekPlayer);
playersSetOne.add(jakubPlayer);
Set<Player> playersSetTwo= new HashSet<>();
playersSetTwo.add(przemekPlayer);
//setPlayer for the team
jeppesenFootballTeam.setPlayers(playersSetOne);
lufthansaFootballTeam.setPlayers(playersSetTwo);
Event kolobrzeskaEvent = new Event();
kolobrzeskaEvent.setOrganizers(organizersSetOne);
kolobrzeskaEvent.setEventName("Kołobrzeska Event");
kolobrzeskaEvent.setTeams(teamsSetOne);
Event westEvent = new Event();
westEvent.setOrganizers(organizerSetTwo);
westEvent.setEventName("West Event");
westEvent.setTeams(teamsSetTwo);
events.add(kolobrzeskaEvent);
events.add(westEvent);
return events;
}
}
这是带有 thymeleaf 和 hibernate 的 Spring boot 项目。当我运行应用程序并查看 H2 数据库控制台时,我得到了正确的表:EVENT_ORGANIZER、ORGANIZER、EVENT、PLAYER、TEAM,但 TEAM_PLAYER 为空,我没有看到任何关系。我尝试使用调试器,但没有效果。哪里有问题?我研究了所有实体类,关系看起来不错,与引导类相同。
如果您需要任何其他信息,请发表评论。 非常感谢您的支持
编辑: 我又调试了一次,我注意到在一些变量旁边我遇到了异常:
Method threw 'org.hibernate.LazyInitializationException' exception. Cannot evaluate java.util.Optional.toString()
之后我设置了 fetch = FetchType.EAGER。但异常情况仍然发生在杰普森足球队可选附近。会不会是数据库关系的问题?
最佳答案
请检查您的 data.sql 文件。表已创建,但数据未插入。检查 ”;;”在行尾。
关于java - 数据库不显示两个特定实体的关系 - Spring Boot 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47168259/