【问题标题】:Spring Boot Data Rest POST returns 204 but only SELECTSSpring Boot Data Rest POST 返回 204 但仅 SELECTS
【发布时间】:2016-06-24 23:09:03
【问题描述】:

所以这在我切换到引导之前就可以工作。基本上我能够将文本/uri-list 发布到 @OneToMany 资源就好了。我将我的项目切换为使用 Boot,并且在过程中的某个地方它停止工作。我可以在@ManyToOne 端放置一个文本/uri 列表,但这不是我想要做的。

当我提交 POST 时,我收到 204 响应,但我可以在控制台上看到 SQL 仅选择而不插入任何内容。 编辑:我使用 Postman,但这里有一个 curl 命令,它执行/返回相同

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

还有 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=?

这是我的相关课程:

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

另一个:

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

如果我缺少任何其他相关信息,请告诉我,我会提供。

【问题讨论】:

  • 你能添加应该插入的代码吗?
  • 您的问题解决了吗?我只是在处理完全相同的问题,而现有的答案并没有那么有帮助。

标签: spring hibernate spring-boot spring-data-rest


【解决方案1】:

Hibernate 收集插入、更新和删除,直到实体管理器被刷新。这通常在事务结束时完成。 因此可能是您的事务管理无法正常工作。

将 org.springframework.transaction 的日志记录设置为调试,而不是您应该看到何时打开和关闭事务。

【讨论】:

  • 已将 logging.level.org.springframework.transaction = debug 添加到我的 application.properties 中,我看到了有关 Hibernate 更改、删除和创建表的更多信息。但是 POST 的输出是相同的,只是选择。就像我说的那样,在另一个端点上发布工作正常,我在日志中看到了插入,反之则没有。
【解决方案2】:

如果你想保持双向,你似乎有两个选择:

  • 删除mappedBy = "developer" 并让JPA 使用joinable 来管理一对多关系。

开发者:

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

游戏:

@ManyToOne
@JoinTable(
        name="DeveloperGame",
        joinColumns = @JoinColumn( name="game_id"),
        inverseJoinColumns = @JoinColumn( name="dev_id")
)
private Developer developer;
  • 如果您不想使用可连接的,请删除mappedBy = "developer"并添加@JoinColumn(让您在关系的两侧都有一个具有相同列名的连接列

开发者:

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

游戏:

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

我想知道这是设计使然,还是 Spring Data REST 中的错误。

【讨论】:

  • 这项工作。我在加入两张桌子时遇到了类似的问题。但是这里的解决方案似乎与我的实现完全相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
  • 2015-08-30
  • 2018-10-08
  • 1970-01-01
相关资源
最近更新 更多