【问题标题】:Add new entity with relation using Spring's RepositoryRestResource使用 Spring 的 RepositoryRestResource 添加具有关系的新实体
【发布时间】:2017-02-15 16:06:50
【问题描述】:

所以我有User

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String username;
    private String password;
    @OneToOne
    private Email email;

    //getters setters, constructors
}

我有Email,即:

@Entity
public class Email {
    @Id
    @GeneratedValue
    private Integer id;
    private String address;

    //getters setters, constructors
}

它们都有自己的CrudRepository,并带有RepositoryRestResource 注释。

我的问题是:如果我想同时创建新用户和新电子邮件以及电子邮件与该用户的关系,我应该向https://localhost:8443/users 提供什么请求正文?我试过这个,但它创建null email_id 的新用户:

{
    "username" : "test",
    "password" : "test",
    "email" : {
        "address" : "olol@lol.kek"
    }
}

【问题讨论】:

  • 尝试公开一个方法,该方法将返回一个新的虚拟用户实体,并检查 spring 如何格式化它,因此以相同的形状发送它。还要检查this out
  • 如何暴露?它是由 spring @AntJavaDev 在运行时创建的
  • gimme sec ,将在您的课程中尝试。我想在你的最后它看起来和发布的完全一样
  • @AntJavaDev 是的,只有它们有 getter 和 setter 方法,以及带有所有参数的默认构造函数和构造函数
  • 奇怪,打印输出给我的 json 和你发布的一样。让我尝试使用 Soap UI 使用它

标签: java spring spring-data spring-data-rest


【解决方案1】:

想通了!

它应该是这样的,用户:

@Entity
@NoArgsConstructor
@AllArgsConstructor
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Getter
    @Setter
    private Integer id;

    @Getter
    @Setter
    private String username;

    @Getter
    @Setter
    private String password;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "email_id")
    @Getter
    @Setter
    private Email email;
}

电子邮件:

@Entity
@NoArgsConstructor
@AllArgsConstructor
public class Email {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Getter
    @Setter
    private Integer id;

    @Getter
    @Setter
    private String address;

    @OneToOne(mappedBy = "email")
    @Getter
    @Setter
    private User user;

    public Email(String address) {
        this.address = address;
    }
}

问题是您必须为两者添加@OneToOne 注释,并为依赖实体提供mappedBy 等参数,为所有者提供@JoinColumn 注释。另外,必须为Email 添加带有String 参数的构造函数,以便可以在运行时调用它(我猜实际上它是“除了id 之外的所有构造函数)。

然后我只是在 POST 请求中将此 JSON 发送到 https://localhost:8443/users

{
    "username" : "test",
    "password" : "test",
    "email" : "lolkek@cheburek.com"
}

它会在数据库中创建新用户,并为该用户创建具有该地址的新电子邮件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 2017-11-13
    • 2014-05-13
    • 2021-12-04
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    相关资源
    最近更新 更多