这是一个REST XML服务。在保存时,子表中的外键值为空。 @Id正在使用序列,它工作正常。我没有在这里添加序列生成器代码。
//Main Entity
------------
@Entity
@Table(name="REQUEST")
public class MsaDisabScreenRequest implements Serializable {
@Id
@Column(name="REQUEST_ID")
private long requestId; //sequence
@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE }, fetch = FetchType.LAZY, mappedBy="msaDisabScreenRequest")
private Set<ReqDetail> disabilities;
}
子实体
@Entity
@Table(name="REQ_DETAILS")
public class ReqDetail implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="MAP_ID")
private long mapId; //sequence
@Column(name="TYPE_ID")
private long disabilityTypeId;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="REQUEST_ID")
privateRequest msaDisabScreenRequest;
}
这是我用来映射的dto。
主 Dto
@XmlRootElement(name="DisabilityRequest")
@XmlAccessorType(XmlAccessType.FIELD)
public class MsaDisabScreenRequestDto implements Serializable {
private static final long serialVersionUID = 1L;
private long requestId;
@NotNull
private Set<DetailDto> disabilities;
}
儿童 DTO
@XmlRootElement(name="disabilities")
@XmlAccessorType(XmlAccessType.FIELD)
public class MsaDisabScreenReqDetailDto implements Serializable {
private static final long serialVersionUID = 1L;
private long mapId;
private long disabilityTypeId;
@XmlTransient
private RequestDto msaDisabScreenRequest;
}
这是控制器
@RequestMapping(value = ApiPath.REQUEST, method = RequestMethod.POST, produces = { "application/xml"})
public @ResponseBody ResultDecorator saveScreeningRequest(@Valid @RequestBody RequestDto requestDto) throws Exception {
.
.
.
.
}
保存使用 JPA 存储库以持久保存的代码。
实现代码仅添加了代码发布以保存
@Autowired
private OrikaBeanMapper mapper;
.
.
.
.
.
.
.
// mapping
Request request = mapper.map(requestDto,Request.class);
Request Res = msaRepository.save(request);
这是我发送的请求有效负载
<?xml version="1.0" encoding="UTF-8" ?>
<DisabilityRequest>
<disabilities>
<disabilityTypeId>9</disabilityTypeId>
</disabilities>
</DisabilityRequest>
在这里,请求 ID 作为空REQ_DETAILS添加到表中。传递的所有其他条目都将保留。
如果您需要任何进一步的详细信息,请告诉我。
当提取类型为 LAZY 时,数据集为空。您可以使用获取类型EAGER 但它很昂贵