我有一个通过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,并使用该方法,使比较。
但是我不知道还有什么其他方式。有什么想法吗?
答案 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上,现有地址将被更新。