jam01
jam01

Reputation: 132

Spring Boot Data Rest POST returns 204 but only SELECTS

So this was working before I switched to Boot. Basically I was able to POST a text/uri-list to a @OneToMany resource just fine. I switched my project to use Boot and somewhere in the process it stopped working. I can PUT a text/uri-list at the @ManyToOne end, but that's not what I want to do.

When I submit the POST, I get a 204 response, but I can see the SQL on my console only Selecting and not inserting anything. EDIT: I use Postman, but here's a curl command that does/returns the same

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

And the logger on 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=?

Here are my relevant classes:

@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;

Other one:

@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;

If I'm missing any other relevant info let me know and I'll provide it.

Upvotes: 6

Views: 690

Answers (2)

ddewaele
ddewaele

Reputation: 22603

If you want to keep it bi-directional you seem to have 2 options :

  • Remove the mappedBy = "developer" and let JPA use a jointable to manage the one-to-many relationship.

Developer:

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

Game:

@ManyToOne
@JoinTable(
        name="DeveloperGame",
        joinColumns = @JoinColumn( name="game_id"),
        inverseJoinColumns = @JoinColumn( name="dev_id")
)
private Developer developer;
  • Remove the mappedBy = "developer" and add a @JoinColumn if you don't want to use a jointable (make you have a joincolumn on both sides of the relationship with the same column name

Developer:

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

Game:

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

I do wonder if this is by design or if this is a bug in Spring Data REST.

Upvotes: 2

Hibernate collects insert, updates and deletes until the entitymanager is flushed. This is normally done at the end of a transaction. So it could be that your transaction management does not work correctly.

Set the logging for org.springframework.transaction to debug, than you should see when transactions are opened and closed.

Upvotes: 1

Related Questions