У меня сопоставлены отношения @OneToOne. Я могу получить записи и увидеть отношения, но я не смог создать запись и сохранить внешний ключ. В настоящее время, когда новая запись создается в родительской таблице (FacilityGeneral), я также создаю новую запись в ChildTable (FacilityLocation), однако внешний ключ в дочерней таблице не создается автоматически.
@Entity
public class FacilityGeneral {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "facilityGenIdSeq")
@SequenceGenerator(name = "facilityGenIdSeq", initialValue = 567, allocationSize = 1)
@Column(updatable = false, unique = true)
private Long generalIdPk;
@NotBlank(message = "Facility Name is required")
private String facilityName;
@OneToOne(fetch = FetchType.EAGER, mappedBy = "facilityGeneral", cascade = CascadeType.PERSIST)
@JsonIgnore
private FacilityLocation location;
}
@Entity
public class FacilityLocation {
@Id
@SequenceGenerator(name = "facilityLocationSeq", initialValue = 374, allocationSize = 1)
@GeneratedValue (strategy = GenerationType.SEQUENCE, generator = "facilityLocationSeq")
@Column(updatable= false, nullable = false, unique = true)
private Long locationIdPk;
@OneToOne (fetch = FetchType.EAGER)
@JoinColumn (name="facilityIdFk")
private FacilityGeneral facilityGeneral;
Я попытался сохранить его программно, назначив значение последовательности, создаваемое в качестве Первичного ключа в родительской таблице (FacilityGeneral), для другого поля в дочерней таблице, но не смог, поскольку Sequence # не генерируется до тех пор, пока объект не будет сохранен , Фактическое поле внешнего ключа осталось пустым.
public FacilityGeneral createOrUpdate(FacilityGeneral facility){
if(facility.getGeneralIdPk() == null) {
//create new facility
Number nextInSeq = entityManager.createNativeQuery("SELECT FACILITY_GEN_ID_SEQ.nextval from dual").getFirstResult();
facility.setGeneralIdPk(nextInSeq.longValue());
//Create new Records for corresponding relationships
FacilityLocation location = new FacilityLocation();
facility.setLocation(location);
location.setFacilityGeneral(facility);
//had a none foreignkey field here that I tried to insert to but failed
//location.setFacilityId(nextInSeq.LongValue());
}
return facilityGeneralRepository.save(facility);
}
Чего мне не хватает для автоматического заполнения поданного внешнего ключа (FacilityIdFk) первичным ключом родительской таблицы?