2017-01-13 3 views
0

ich diesen Code haben:JPA OneToMany bleibt nur ein

@Table(name = "Prize")  
public class Prize { 
    @Id 
    @Column(
     nullable = false, 
     unique = true 
    ) 
    private int id; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @Fetch(FetchMode.JOIN) 
    private Set<TicketNumber> numbers; 

} 

@Table(name = "TicketNumber") 
public class TicketNumber { 
    @Id 
    @Column(
     nullable = false, 
     unique = true 
    ) 
    private int id; 
} 

Dies erzeugt eine Tabelle Prize_TicketNumber mit zwei Feldern (Prize_id und TicketNumber_id) genannt beitreten, aber wenn ich einen Preis mit vielen Zahlen zu speichern, nur ein Datensatz eingefügt in der Tabelle. Weiß jemand warum?

EDIT: Dies ist der Code der Einfügung. Die Repositories sind einfache JpaRepositories.

Prize prize = prizeRepository.findById(prizeId); 
if(prize == null) return; 
List<TicketNumber> winners = ticketNumberRepository.findByPrizeId(fixedPrize.getId()); 
if (winners != null && !winners.isEmpty()) { 
    for (TicketNumber winner : winners) { 
     winner.setWinner(false); 
     TicketNumber t = ticketNumberRepository.save(winner); 
    } 
    raffleNumberRepository.flush(); 
} 
prize.getTicketNumbers().clear(); 
for (String ticketId : ids) { 
    TicketNumber ticketNumber = ticketNumberRepository.findOne(ticketId); 
    if (ticketNumber != null) { 
     ticketNumber.setWinner(true); 
     prize.getTicketNumbers().add(raffleNumber); 
    } 
} 
prize.setNumbersAssigned(true); 
prizeRepository.saveAndFlush(prize); 
+0

Geben Sie Ihren Code ein. Der Code, der die Einfügung von Ma-, Y-Zahlen und den gesamten Code der beiden Entitäten ausführt. –

+1

Haben Sie versucht, List statt Set zu verwenden? Vielleicht hast du ein Problem mit Equals – Bartun

+1

Ich wette, es ist gleich und hashCode zu –

Antwort

-2

Eine Eins-zu-viele-Verknüpfung sollte keine Join-Tabelle benötigen. Bei einer Eins-zu-viele-Verknüpfung sollte das Kind die ID für den Elternteil halten.

Es sieht so aus, als ob die Eltern-ID Ihres Kindes fehlt. Hibernate geht davon aus, dass es sich um eine Viele-zu-Viele-Verknüpfung handelt, und erstellt dann die Join-Tabelle.

+1

Nein. Eine Join-Tabelle ist die angegebene Standardzuordnung für eine unidirektionale Eins-zu-viele-Verknüpfung und aus gültigen Gründen. Und das beantwortet die Frage sowieso nicht. –

+0

Sie erwähnen, dass es einen guten Grund für eine Join-Tabelle für ein "on-to-many" gibt - können Sie Ihre Meinung teilen, warum eine zusätzliche Tabelle in diesem Fall vorteilhaft ist? Mein Vorschlag ist auch, dass das Ändern des Mappings das Problem beheben könnte, aber ich verstehe, dass das nicht völlig klar war. –

+1

Wenn es unidirektional ist, bedeutet das, dass die vielen Seiten nicht über die eine Seite wissen sollten. Eine Spalte in den vielen Beistelltischen zu haben, um diese Assoziation zu materialisieren, vereitelt den Zweck. –

Verwandte Themen