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.
 


Schreibe deine Antwort... und nutze den </> Button, wenn du Code posten möchtest...
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Spring Boot Integration Test von Routes Allgemeine Java-Themen 2
OnDemand SOAP Rest Spring Boot Allgemeine Java-Themen 5
H JPackage + Spring Allgemeine Java-Themen 6
Zrebna Bitte um Empfehlungen für "zeitlose" Bücher bzgl. Backend mit Spring und Beans Allgemeine Java-Themen 25
M Spring Locking Allgemeine Java-Themen 13
M Spring Locking Allgemeine Java-Themen 6
M Spring Security Allgemeine Java-Themen 2
OnDemand Übersetzung Spring mit Iln8 Allgemeine Java-Themen 0
OnDemand Mit Jenkins gebaut: NPE Spring Context Allgemeine Java-Themen 7
N Value Wert aus HTML-Button mittels thymeleaf spring an java übergeben Allgemeine Java-Themen 2
8u3631984 Spring Component mit Builder Allgemeine Java-Themen 20
A Spring und Hibernate Allgemeine Java-Themen 2
T Was ist Spring? Allgemeine Java-Themen 9
G Spring Allgemeine Java-Themen 7
Tom299 eine Konstante in Spring definieren? Allgemeine Java-Themen 4
M Spring oder nicht, das ist hier die Frage Allgemeine Java-Themen 3
data89 Java als Boot-Prozess/Daemon? Allgemeine Java-Themen 6
S 1. deutsches JAVA (Boot) CAMP 2006 Allgemeine Java-Themen 3
P Entity Objekt Methoden vs Service methoden Allgemeine Java-Themen 2
U EJB Entity mit List Problem Allgemeine Java-Themen 2
S JPA und Entity-Klassen: Wert ungültig Allgemeine Java-Themen 6
T JPA Entity im Client-Server-Umfeld Allgemeine Java-Themen 19
G Entity Objekt Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben