Spring Boot Entity mit Liste

bueseb84

Mitglied
Hallo zusammen
ich habe folgende Klasse :


[CODE lang="java" title="Meine Klasse mit Listen"]@NoArgsConstructor(access = AccessLevel.PRIVATE)
@EqualsAndHashCode
@ToString
@Entity
@Table(name = "SamsMember")
public class SamsMember implements IMember {

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

@Getter
private String name;

@Getter
private String preName;

@Getter
@ManyToMany(fetch = FetchType.EAGER)
@EqualsAndHashCode.Exclude
private List<SamsTeam> teamList;

public SamsMember(String name, String preName) throws SamsParameterException {
this(name, preName, Lists.newArrayList());
}

/**
* create a new sams member object
*
* @param name - the member name
* @param preName- the member pre name
* @throws SamsParameterException - if an error occurred
*/
public SamsMember(String name, String preName, List<SamsTeam> teamList) throws SamsParameterException {
checkParameter(name, "name");
checkParameter(preName, "preName");
checkParameter(teamList, "teamList", true);


this.name = name;
this.preName = preName;
this.teamList = teamList;
}

...[/CODE]
Ich habe eine weitere Klasse um das SamsMember Objekt zu speichern :

Java:
@Repository
public interface SamsMemberRepository extends JpaRepository<SamsMember, Integer> {

    default SamsMember saveObject(SamsMember member) {
        Optional<SamsMember> dbObjet = findAll().stream().filter(o -> o.equals(member)).findFirst();

        if (!dbObjet.isPresent()) {
            save(member);
            return member;
        } else {
            return dbObjet.get();
        }
    }
}

Und mein Unit Test :
Java:
    @Test
    @DisplayName("save sams member with team list")
    public void saveSamsMemberWithTeamList() throws SamsParameterException {
        member.addTeam(team1);
        assertEquals(1, member.getTeamList().size());

        log.info("save samsMember : '{}'", member);
        member = memberRepository.saveObject(member);
        assertEquals(1, memberRepository.count());

        List<SamsMember> memberList = memberRepository.findAll();
        assertEquals(1, memberList.size());

        SamsMember dbMember = memberList.get(0);
        assertNotNull(dbMember);

        List<SamsTeam> teamList = dbMember.getTeamList();
        assertNotNull(teamList);
        assertEquals(1, teamList.size()); // FEHLER

        SamsTeam team = teamList.get(0);
        assertNotNull(team);
        assertEquals(team, team1);
    }

Was maht der Test ? Er erzeugt ein Team und Member objetkt. Die Erzeugung befindet sich einer Init Methode. Die beiden Objekte werden in die Datenbank geschrieben und auch geprüft,dass sie enthalten sind.
Anschließend wird dem Member Objekt das Team zugewiesen und wieder abgespeichert. Nun wir das Member Objekt aus der Datenbank wieder herausgeholt und geprüft dass das Team auch noch in der Liste enthalten ist. Aber genau das passiert nicht.

Kann mir jemand einen Hinweis geben warum das nicht richtig initialisiert wird ?
 
K

kneitzel

Gast
Erster Verdacht: Dein Member war bereits gespeichert und durch den save Aufruf wird nichts gemacht außer das Objekt aus dem Repository heraus gesucht und zurück gegeben. Die Veränderung scheinst Du aber nicht zu speichern... Oder habe ich da jetzt etwas übersehen?
 

bueseb84

Mitglied
Nein du hast nichts übersehen. Ich habe da falsh geadcht. Die Stelle war genau richtig habe es nun so gelöst

Java:
    default SamsMember saveObject(SamsMember member) {
        Optional<SamsMember> dbObjet = findAll().stream().filter(o -> o.equals(member)).findFirst();

        if (dbObjet.isPresent()) {
            delete(dbObjet.get());
        }

        saveAndFlush(member);
        return member;
    }

Dir vielen Dank für den entscheidenden Hinweis !!!!
 

thecain

Top Contributor
Ich bin mir nicht sicher, ob das wirklich "die" Lösung ist. Meiner Meinung nach sollte ein Insert OR Update machen. du müstest also das existierende Objekt gar nicht lesen.

Zudem ist das finden via findAll und filter sicher nicht die performanteste Lösung.
 

mrBrown

Super-Moderator
Mitarbeiter
Vor allem wird das Objekt ja nicht nur gelesen, sondern dann auch noch gelöscht – das klingt alles andere als sinnvoll und ist was völlig anderes, als es nur ein Update.

BTW: Lomboks EqualsAndHashCode ist bei Entitys gefährlich, und besonders das ignorieren der ID ist merkwürdig und führt uU zu Inkonsistenzen.
 

Ähnliche Java Themen

Neue Themen


Oben