Save Entity With List of entities

8u3631984

Bekanntes Mitglied
Halllo zusammen

ich habe folgendes vor : Ich möchte in einer Team Klasse eine List von Athleten speichern.

Hier meine Team Klasse :
Java:
@Entity
@Builder(setterPrefix = "with")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString
@EqualsAndHashCode
public class Team implements ITeam {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Getter
    private Integer id;

    // required field
    @NonNull
    @Getter
    @EqualsAndHashCode.Exclude
    private String name;

    @NonNull
    @OneToMany(mappedBy = "order", fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
    @Getter
    private List<Athlete> athleteList;

Hier meine Athlete Klasse :
Java:
@Entity
@Builder(setterPrefix = "with")
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString
@EqualsAndHashCode
public class Athlete implements IAthlete {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Getter
    private Integer id;

    // required field
    @NonNull
    @Getter
    @EqualsAndHashCode.Exclude
    private String name;

    // required field
    @NonNull
    @Getter
    @EqualsAndHashCode.Exclude
    private String preName;

    // required field
    @NonNull
    @Getter
    @EqualsAndHashCode.Exclude
    private LocalDate birthday;

    // required field
    @NonNull
    @Getter
    @EqualsAndHashCode.Exclude
    private Gender gender;
}

Hier die beiden Repositories :

[CODE lang="java" title="Team Repository"]
@Repository
public interface ITeamRepository extends JpaRepository<Team, Integer> {

default Team saveObject(@NonNull Team team) {
// define filter
Predicate<Team> filterByName = t -> t.getName().equals(team.getName());

Predicate<Team> filterByClub = t -> {
if (team.getClub().isPresent()) {
return t.getClub().isPresent() && t.getClub().get().getId() == team.getClub().get().getId();
} else {
return !t.getClub().isPresent();
}
};

Predicate<Team> filterByCompetition = t -> {
if (team.getCompetition().isPresent()) {
return t.getCompetition().isPresent() && t.getCompetition().get().getId() == team.getCompetition().get().getId();
} else {
return !t.getCompetition().isPresent();
}
};

Optional<Team> searchResult = findAll()
.stream()
.filter(filterByName.and(filterByClub).and(filterByCompetition))
.findFirst();

if (searchResult.isPresent()) {
return searchResult.get();
} else {
return save(team);
}
}
}
[/CODE]

Und hier mein Athlete Repository :
Java:
@Repository
public interface IAthleteRepository extends JpaRepository<Athlete, Integer> {

    default Athlete saveObject(@NonNull Athlete athlete) {
        // define filter
        Predicate<Athlete> filterByName = a -> a.getName().equals(athlete.getName());

        Predicate<Athlete> filterByPreName = a -> a.getPreName().equals(athlete.getPreName());

        Predicate<Athlete> filterByGender = a -> a.getGender().equals(athlete.getGender());

        Predicate<Athlete> filterByBirthday = a -> a.getBirthday().equals(athlete.getBirthday());

        Optional<Athlete> searchResult = findAll()
                .stream()
                .filter(filterByName.and(filterByPreName).and(filterByGender).and(filterByBirthday))
                .findFirst();

        if (searchResult.isPresent()) {
            return searchResult.get();
        } else {
            return save(athlete);
        }
    }
}

Ich versuche per :
Java:
        team1 = Team.builder()
                .withName(TEAM1_NAME)
                .build();
        log.info("build team object : {}", team1);

        team1 = teamRepository.saveObject(team1);
        log.info("saved team : {}", team1);

Das Team zu speichern. Bekommen aber folgende fehler :
Java:
Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: model.athlete.Athlete.order in model.team.Team.athleteList
    at org.hibernate.cfg.annotations.CollectionBinder.bindStarToManySecondPass(CollectionBinder.java:844) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
    at org.hibernate.cfg.annotations.CollectionBinder$1.secondPass(CollectionBinder.java:795) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
    at org.hibernate.cfg.CollectionSecondPass.doSecondPass(CollectionSecondPass.java:53) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1693) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
    at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.processSecondPasses(InFlightMetadataCollectorImpl.java:1661) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
    at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:295) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1224) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1255) ~[hibernate-core-5.4.27.Final.jar:5.4.27.Final]

Hat jemand eine Idee woran es liegen könnte ?

Vielen Dank !
 
Und wenn du schon die ganzen Interfaces machst (was meiner Meinung nach unnötig ist) solltest du sie auch verwenden. Hat aber nichts mit dem Problem zu tun.
 
Vielen Dank euch beiden. Der Tipp mit dem mappedBy war goldrichtig. Die Interfaces werden im Repository Manager verwendet.Den Ausschnitt habe ich allerdings nicht gepostet
 

Neue Themen


Zurück
Oben