java - 数据库不显示两个特定实体的关系 - Spring Boot 应用程序

标签 java spring hibernate h2 bootstrapping

花了一天的时间来解决这个问题,但没有发现问题。我不需要完美的解决方案,只要给我指示就是问题所在。我在哪里可以找到有关此事的信息。

我创建了一些实体,其中一些您可以在下面找到(不是所有字段,只是此任务所需的):

@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/

相关文章:

java - 如何在android导航组件中手动关闭 fragment

java - 尝试使用 jtextfield 捕获异常?

java - 设置java_home奇怪的错误

jquery - Jackson (JSON) 当 Float 为 null 时抛出 JsonMappingException

java - 利用 Hibernate 延迟加载?

java - 如果我有超过 1 个版本用于项目,如何设置 JAVA_HOME 或 CATALINA_HOME?

java - 将自定义 @Controller 添加到 Maven Overlay?

java - 如何在java中分离授权服务器spring security

java - JPA - @MapKey 和 @EmbeddedId

java - Oracle 序列通过缓存大小+最后一个数字进行更新