spring-data-rest spring-data-jpa не сохраняет дочернюю сущность - PullRequest
0 голосов
/ 13 мая 2019

Простое сопоставление 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 имеет PK "id" и внешний ключ "address_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> {
}

Когда я POST / gencontractors {"email:" bla "," address ": {" name ":" bla ", ...}}, адресне сохранены в таблице адресов.

Что мне не хватает?

1 Ответ

0 голосов
/ 12 июня 2019

Адрес является НЕ встроенным объектом, поэтому вы не можете написать его свойства напрямую через родительский объект.

Вам необходимо создать объект в два этапа:

  1. POST / address {"name": "bla", ...}
  2. Возвращается со ссылкой на вновь созданный объект -> http: //.../gencontractors/X. Вам необходимо использовать эту ссылку в качестве адреса:
  3. POST / gencontractors {"email:" bla "," address ":" http: //.../gencontractors/X "}
...