2016-03-10 4 views
6

Das funktionierte also, bevor ich zu Boot wechselte. Grundsätzlich konnte ich eine Text-/URI-Liste an eine @ OneToMany-Ressource senden. Ich habe mein Projekt auf Boot umgestellt und irgendwo im Prozess hat es aufgehört zu arbeiten. Ich kann am @ManyToOne-Ende eine Text/URI-Liste einfügen, aber das ist nicht das, was ich machen möchte.Spring Boot Data Rest POST gibt 204 zurück, aber nur SELECT

Wenn ich den POST abschicke, bekomme ich eine 204 Antwort, aber ich kann nur die SQL auf meiner Konsole auswählen und nichts einfügen. EDIT: Ich benutze Postman, aber hier ist ein curl Befehl, der tut/liefert den gleichen

curl -v -X POST -H "Content-Type: text/uri-list" -d "http://localhost:8080/games/2" http://localhost:8080/developers/1/gameList 

Und den Logger auf IDEA:

Hibernate: select developer0_.developer_id as develope1_1_0_, developer0_.name as name2_1_0_ from developer developer0_ where developer0_.developer_id=? 
Hibernate: select game0_.game_id as game_id1_6_0_, game0_.developer_id as develope5_6_0_, game0_.esrb_rating as esrb_rat2_6_0_, game0_.name as name3_6_0_, game0_.release_date as release_4_6_0_, developer1_.developer_id as develope1_1_1_, developer1_.name as name2_1_1_ from game game0_ left outer join developer developer1_ on game0_.developer_id=developer1_.developer_id where game0_.game_id=? 

Hier meine relevanten Klassen sind:

@Entity 
public class Developer { 
    @Id 
    @GeneratedValue 
    @Column(name = "developerId") 
    private Long id; 

    private String name; 

    @OneToMany(mappedBy = "developer", cascade = CascadeType.ALL) 
    private List<Game> gameList; 

Andere:

@Entity 
public class Game { 
    @Id 
    @GeneratedValue 
    @Column(name = "gameId") 
    private Long id; 

    private String name; 

    private Date releaseDate; 

    private ESRBRating esrbRating; 

    @ManyToMany(mappedBy = "gameList", cascade = CascadeType.ALL) 
    private List<User> userList; 

    @ManyToOne 
    @JoinColumn(name = "developerId") 
    private Developer developer; 

Wenn ich irgendwelche anderen relevanten Informationen vermisse, lassen Sie mich wissen, und ich werde es zur Verfügung stellen.

+1

Können Sie den Code hinzufügen, der einfügen sollte? –

+0

Haben Sie Ihr Problem schon gelöst? Ich habe nur mit genau dem gleichen Problem zu tun und die vorhandenen Antworten waren nicht so hilfreich. – Smajl

Antwort

1

Hibernate sammelt Einfüge-, Aktualisierungs- und Löschvorgänge, bis der EntityManager gelöscht wird. Dies geschieht normalerweise am Ende einer Transaktion. So könnte es sein, dass Ihre Transaktionsverwaltung nicht korrekt funktioniert.

Legen Sie die Protokollierung für org.springframework.transaction zu debuggen, als Sie sehen sollten, wenn Transaktionen geöffnet und geschlossen werden.

+0

'logging.level.org.springframework.transaction = debug' zu meiner Anwendung hinzugefügt.Eigenschaften und ich sehe mehr Informationen über Hibernate Ändern, Löschen und Erstellen von Tabellen. Aber die Ausgabe für den POST ist die gleiche, nur wählt aus. Wie ich schon sagte, das Posting auf dem anderen Endpunkt funktioniert gut und ich sehe die Einfügung in das Protokoll, einfach nichts umgekehrt. – jam01

2

Wenn Sie wollen, dass es halten bidirektionaler Sie scheinen zwei Optionen zu haben:

  • die mappedBy = "developer" entfernen und lassen JPA einen jointable verwenden, um die Eins-zu-viele-Beziehung zu verwalten.

Hersteller:

@OneToMany(cascade = CascadeType.ALL) 
@JoinTable(
     name="DeveloperGame", 
     joinColumns = @JoinColumn(name="dev_id"), 
     inverseJoinColumns = @JoinColumn(name="game_id") 
) 
private List<Game> gameList; 

Spiel:

@ManyToOne 
@JoinTable(
     name="DeveloperGame", 
     joinColumns = @JoinColumn(name="game_id"), 
     inverseJoinColumns = @JoinColumn(name="dev_id") 
) 
private Developer developer; 
  • die mappedBy = "developer" entfernen und einen @JoinColumn hinzufügen, wenn Sie einen jointable nicht verwenden wollen (stellen Sie eine joincolumn haben auf beide Seiten der Beziehung mit dem gleichen Spaltennamen

Hersteller:

@OneToMany(cascade = CascadeType.ALL) 
@JoinColumn(name = "devId") 
private List<Game> gameList; 

Spiel:

@ManyToOne 
@JoinColumn(name = "devId") 
private Developer developer; 

Ich frage mich, ob dies durch Design ist oder wenn dies ein Fehler in Spring Data REST ist.

+0

Hat das funktioniert? Ich habe ein ähnliches Problem beim Verbinden von zwei Tabellen. Aber die Lösung scheint genau so zu sein wie meine Implementierung. – Amit