Spring Data Rest:与未导出实体相关的POST实体

时间:2019-02-01 15:47:09

标签: java spring spring-data-rest

我有一个通过Spring Data Rest导出的实体类型,并且与没有自己的REST端点的实体有关系:

@Data
@NoArgsConstructor
@EqualsAndHashCode
@Entity
public class Request {

    ...

    @NotNull
    @OneToOne(cascade = CascadeType.ALL)
    @Immutable
    private Address address;

“地址”类型大致类似于此,再加上地址的常用内容;)

@NoArgsConstructor
@Entity
@Getter
@Setter
public class Address {

    @Id
    @GeneratedValue
    private Long id;

有是延伸CrudRepository但NO储存库的地址类型一RequestRepo。

这是我的工作: 1.获取特定的请求实体 2.更改请求的属性(非地址) 3.放入整个请求

在处理程序的@BeforeSave注释方法中,我注意到address属性的ID为“ null”。因此看来,它没有在数据库中寻找该地址,而只是创建了一个新地址。

嗯,我知道,由于没有发布ID,因此无法知道应该在数据库中的哪个地址。那是有道理的。

在处理程序中,我想检查地址是否已更改,然后根据该信息执行操作。因此,我从数据库中获取了旧版本的Request并比较了两个Address的ID,这当然会导致NullPointerException,因为发布的Address的ID为null。我的快速的解决方案是实现equals()省略ID,并使用该方法,使比较。

但是我不知道还有什么其他方式。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我将地址设置为可嵌入而不是实体:没有请求,地址将不存在,并且本身不是实体。您不太可能要查询地址。如果您有许多共享同一地址的实体,但这可能是不同的,但是它是一对一的,所以您不会。

您可以使用@SecondaryTable保持相同的数据库结构。

请求:

@Data
@NoArgsConstructor
@EqualsAndHashCode
@Entity
@Table(name = "requests")
@SecondaryTable("name = "addresses")
public class Request {

    @NotNull
    @Embedded
    private Address address;
}

地址:

@NoArgsConstructor
@Embeddable
@Getter
@Setter
public class Address {

    @Column(name="town", table="addresses")
    private String town;
}

现在在PUT上,现有地址将被更新。