2017-11-07 4 views
1

verbrachte auf diese über einen Tag und kann ein Problem nicht erkennen. Ich brauche keine perfekte Lösung, gib mir nur Anweisungen, wo das Problem liegt. Wo kann ich Informationen darüber finden.Datenbank nicht zeigen Beziehungen für zwei bestimmte Einheiten - Spring-Boot-App

Ich habe einige Einheiten, von denen einige Sie können unten finden (nicht alle Felder, nur für diese Aufgabe erforderlich):

@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; 
} 

ich eine Bootstrap-Klasse erstellt haben, die Daten einige Daten aus Daten nehmen können. sQL-Datei:

@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; 
    } 
} 

Es ist Frühling Bootprojekt mit thymeleaf und überwintert. Wenn ich die Anwendung starte und in die H2-Datenbankkonsole schaue, habe ich korrekte Tabellen: EVENT_ORGANIZER, ORGANIZER, EVENT, PLAYER, TEAM aber der TEAM_PLAYER ist leer, ich sehe keine Beziehung. Ich habe versucht, Debugger zu verwenden, aber keinen Effekt. Wo ist das Problem? Ich studierte alle Entitäten Klassen und Beziehungen sieht gut aus, das gleiche mit Bootstrap-Klasse.

Wenn Sie weitere Informationen benötigen, kommentieren Sie einfach. Vielen Dank für Ihre Unterstützung

EDIT: ich es noch einmal ausgetestet, und ich bemerkte, dass neben einige Variablen, die ich habe Ausnahme:

Method threw 'org.hibernate.LazyInitializationException' exception. Cannot evaluate java.util.Optional.toString() 

Danach hole ich gesetzt = FetchType. EIFRIG. Aber die Ausnahme tritt immer in der Nähe von JeppesenFootballTeamOptional auf. Könnte es ein Problem mit Beziehungen in der Datenbank sein?

Antwort

0

Überprüfen Sie bitte Ihre Datei datas.sql. Die Tabelle wird erstellt, aber Daten werden nicht eingefügt. prüfen Auf ";;" am Ende der Zeile.

+0

keine data.sql ist korrekt. Ich habe es dreimal überprüft. – przemekost

0

Ich habe eine Lösung für dieses Problem!

Zuerst Bootstrap Klasse Update: Ich änderte Optional und Laden kleiner Menge od Daten von einer data.sql zum Erstellen neuer Team-Objekt in der Bootstrap-Klasse.

Team jeppesenFootballTeam = new Team(); 
    jeppesenFootballTeam.setTeamName("Jeppesen Football Team"); 
    jeppesenFootballTeam.setPlayers(playersSetTwo); 

    Team lufthansaFootballTeam = new Team(); 
    lufthansaFootballTeam.setTeamName("Lufthasna Football Team"); 
    lufthansaFootballTeam.setPlayers(playersSetOne); 

    Set<Team> teamsSetOne = new HashSet<>(); 
    teamsSetOne.add(jeppesenFootballTeam); 

    Set<Team> teamSetTwo = new HashSet<>(); 
    teamSetTwo.add(jeppesenFootballTeam); 
    teamSetTwo.add(lufthansaFootballTeam); 

Zweites Problem mit ‚org.hibernate.LazyInitializationException‘ gelöst durch Hinzufügen eines „holen = FetchType.EAGER“ der Beziehung Anmerkung für Spieler und Veranstalter Klasse (Klasse, die wir Optional verwenden Objekt von data.sql zu erstellen) .

Am Ende ich über eine wichtige Sache vergessen, eine Kaskade Typen der Eltern ergänzt:

@ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "event_team", 
      joinColumns = @JoinColumn(name = "event_id"), 
      inverseJoinColumns = @JoinColumn(name = "team_id")) 
    private Set<Team> teams = new HashSet<>(); 

Ich mag hinzufügen, dass Probleme treten auf, wenn wir einige Daten aus data.sql und Additionaly laden möchten Wir möchten einige Eigenschaften in der Bootstrap-Klasse festlegen.

Dies ist eine vollständige Lösung für meine Probleme. Ich hoffe, es wird jemand anderem helfen, danke!

Verwandte Themen