Java Spring数据Rest:过帐实体与非导出实体的关系

Java Spring数据Rest:过帐实体与非导出实体的关系,java,spring,spring-data-rest,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; “Address”类型大致如

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

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

    ...

    @NotNull
    @OneToOne(cascade = CascadeType.ALL)
    @Immutable
    private Address address;
“Address”类型大致如下加上地址的常用内容;)

有一个RequestRepo扩展了Crudepository,但没有地址类型的存储库

我就是这么做的: 1.获取特定的请求实体 2.更改请求的属性(不是地址) 3.把整个请求

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

好吧,我理解,因为id没有发布,所以没有办法知道这个应该是数据库中的哪个地址。这是有道理的

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


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

我想让地址成为一个可嵌入的而不是一个实体:没有请求,地址就不可能存在,它本身也不是一个实体。您不太可能想要查询地址。如果您有多个实体共享同一地址,这可能会有所不同,但这是一个实体,所以您不会

您可以使用
@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;
}

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

如果请求与地址有一对多关系,此操作是否有效?我有一个与地址相关的不同实体的这种情况。你不能在每次得到答案时都不断扩展你的问题。顺便说一句,你可以使用
@ElementCollection
映射多个嵌入项。在这种情况下,你需要在每次更新时发送每个地址。我当然可以。谢谢,我试试看!
@NoArgsConstructor
@Embeddable
@Getter
@Setter
public class Address {

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