【问题标题】:spring-data-rest spring-data-jpa doesn't save child entityspring-data-rest spring-data-jpa 不保存子实体
【发布时间】:2019-09-30 17:55:52
【问题描述】:

只是一个简单的 OneToOne 映射,单向。

实体

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = {"createdAt", "updatedAt"})
@Data 
public abstract class ID implements Serializable {

    @Id
    @GeneratedValue
    @Column(name = "id")
    private UUID id;
}

@RequiredArgsConstructor(onConstructor = @__(@PersistenceConstructor))
@AllArgsConstructor
@Builder
@Data
@Entity(name = "gencontractor")
@Table(name = "gencontractor")
public class GenContractor extends ID {

    @Column(updatable = false)
    private String email;

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "address_id", referencedColumnName = "id")
    private Address address;
}

@RequiredArgsConstructor(onConstructor = @__(@PersistenceConstructor))
@AllArgsConstructor
@Builder
@Data
@Entity(name = "address")
@Table(name = "address")
public class Address extends ID {

    @Column
    private String name;

    @Column
    private String street;

    @Column
    private String city;

    @Column
    private String phone;
}

表地址的 PK 为“id”。表 GenContractor 具有到 Address.id 的 PK“id”和外键“address_id”。

存储库

@RepositoryRestResource(collectionResourceRel = "gencontractors", path = "gencontractors")
public interface GenContractorRepository extends JpaRepository<GenContractor, UUID> {
}
@RepositoryRestResource(collectionResourceRel = "addresses", path = "addresses")
public interface AddressRepository extends JpaRepository<Address, UUID> {
}

当我发布 /gencontractors {"email: "bla", "address": {"name":"bla", ...}} 时,地址不会保存到地址表中。

我错过了什么?

【问题讨论】:

  • 你错过了关系的反面。将@OneToOne(mappedBy="address") GenContractor genContractor 添加到Address 类中,以指定关系的拥有方是GenContractor 类。
  • @thanhngo 是的,我已经尝试过了,但没有用。这只会使它成为双向与单向。

标签: hibernate spring-boot jpa spring-data-jpa spring-data-rest


【解决方案1】:

地址不是嵌入对象,因此不能直接通过父对象写入其属性。

您需要分两步创建对象:

  1. POST /address {"name":"bla", ...}
  2. 它返回一个指向新创建对象的链接 -> http://.../gencontractors/X。您需要使用此链接作为地址:
  3. POST /gencontractors {"email: "bla", "address": "http://.../gencontractors/X"}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-21
    • 1970-01-01
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多