Spring Data Rest发布无法保存嵌套对象

时间:2018-09-20 22:12:24

标签: java spring sql-insert hibernate-mapping spring-data-rest

我有这些对象:

@Data
@Entity
@Table
@EqualsAndHashCode(callSuper = true)
public class User extends AbstractEntity implements Serializable {

   private static final long serialVersionUID = -55089179131569489L;

   private String username;
   private String email;
   private boolean admin;
   private String name;
   private String surname;

   @OneToMany(mappedBy = "owner")
   private List<Ad> ads;
}

@Entity
@Table
@Data
@EqualsAndHashCode(callSuper = true)
public class Ad extends AbstractEntity implements Serializable {

    private static final long serialVersionUID = -4590938091334150254L;
    private String name;
    private String description;
    private double price;

    @Enumerated(EnumType.STRING)
    private Category category;

    @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinColumn(name = "OWNER_ID")
    private User owner;

}

当我尝试使用类型为Ad.class的对象并在用户类型为User.class的现有对象中执行POST(已经在数据库中)时,该服务仅保存Ad对象,并且连接列“ OWNER_ID”保持为空。

我认为映射是正确的。您能帮我解决问题吗?

这是我的存储库:

@Repository
@Transactional(readOnly = true)
public interface AdRepository extends PagingAndSortingRepository<Ad, String> 
{}  

这是我的RestRepository

@RepositoryRestResource(collectionResourceRel = "ad", path = "ad")
public interface AdRestRepository extends PagingAndSortingRepository<Ad, String> {}

1 个答案:

答案 0 :(得分:1)

如果我退后一步,概括一下您的问题,

您正在尝试发布一个子资源,并期望

的两种操作
  • 制作新资源(Ad)
  • 与所有者(用户)建立关联

只需一次通话即可实现。

但是不幸的是,spring-data-rest并不支持这种行为。您需要致电2次。

  • 使用实际有效载荷
  • 将资源(Ad)=> POST 制作为/ads
  • 其次,通过第一次调用创建的资源的 hateoas链接,将关联=> POST users/{ownerId}

看看官方文档的this部分。